gpt4 book ai didi

go - 获取已知结构字段的名称

转载 作者:IT王子 更新时间:2023-10-29 01:18:53 24 4
gpt4 key购买 nike

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

type Object struct {
Id string
Field1 string
Field2 int
}

我希望有一个函数可以在数据库中的特定字段被修改时更新该字段,大致如下:

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

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

我已经查看了 reflect 包,如果能够获得代表我正在使用的字段的 StructField 就好了,但它似乎需要通过硬编码字符串提供字段名称,或字段在结构中的索引(可能会发生变化)。

最佳答案

不是在您所说的上下文中。它不是作为参数传入的,因此您需要一些其他方法来指定 要发送的结构字段中的哪些。这里的心理差距是你试图把那个 set 函数当作一个属性来对待,而实际上它不是;在其他语言中,属性之间的主要区别在于属性绑定(bind)到特定的字段,而您的SetField1 方法绑定(bind)到整个结构。该方法还不如设置两个 字段。

一般来说,如果你正在做字段反射的东西,并且你想用字段做花哨的动态东西,你想使用结构标签。例如,像这样:

type Object struct {
Id string `db:"id"`
Field1 string `db:"field1"`
Field2 int `db:"field2"`
}

您可以像这样访问这些标签:

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"))
}
}

这并不是一个真正的完整解决方案,但是......以这种方式提出的问题是不可能做到的。

关于go - 获取已知结构字段的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14514312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com