获取已知结构字段的名称

Chr*_*ris 2 go

我有一个表示数据库中对象的结构,如:

type Object struct {
    Id string
    Field1 string
    Field2 int
}
Run Code Online (Sandbox Code Playgroud)

而且我希望有一个函数可以在修改字段时更新数据库中的特定字段,具体如下:

func (self *Object) SetField1(value string) {
    self.Field1 = value
    database.Update(self.Id, "Field1", self.Field1) // pseudocode
}
Run Code Online (Sandbox Code Playgroud)

有没有办法替换"Field1"硬编码字符串,以便我的代码能够抵抗结构字段排序和命名的未来变化?

我已经在反射包周围戳了一下,能够获得表示我正在使用的字段的StructField会很好,但它似乎需要通过硬编码字符串的字段名称,或者struct中的字段索引(可能会发生变化).

jor*_*lli 6

不是在你谈论的背景下.它不是作为参数传入的,因此您需要一些其他方法来指定要发送哪个 struct的字段.这里的心理差距是你试图将那个集合函数视为一个属性,而不是它; 如其他语言所示,属性之间的关键区别在于属性绑定到特定字段,而您的SetField1方法绑定到整个结构.该方法也可以设置两个字段.

一般来说,如果你正在做现场反思的东西,并且你想用字段做一些花哨的动态东西,你想要使用struct标签.例如,像这样:

type Object struct {
    Id string     `db:"id"`
    Field1 string `db:"field1"`
    Field2 int    `db:"field2"`
}
Run Code Online (Sandbox Code Playgroud)

你可以访问这些标签,如:a-this:

package main

import (
    "reflect"
    "fmt"
)

func main() {
    var x struct {
        MyField int `core:"required"`
    }
    t := reflect.TypeOf(x)

    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        fmt.Println(field.Name, ":", field.Tag.Get("core"))
    }
}
Run Code Online (Sandbox Code Playgroud)

这不是一个完整的解决方案,但......问题的方式是不可能的.