我有一个表示数据库中对象的结构,如:
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中的字段索引(可能会发生变化).
不是在你谈论的背景下.它不是作为参数传入的,因此您需要一些其他方法来指定要发送哪个 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)
这不是一个完整的解决方案,但......问题的方式是不可能的.