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

标签 go

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

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/

相关文章:

casting - Go:在类型开关中将任何 int 值转换为 int64

pointers - slice 指针的内存值是什么意思?

multithreading - Golang sleep 线程而不是忙于等待

go - 使用 uintptr 作为弱引用是否安全

go - 我应该使用 panic 还是返回错误?

math - Golang 中的大 Int 添加

types - 去Go语言: Type assertion on customized type

go - 当路由方法不匹配时,在 gorilla 多路复用器中发送自定义响应

json - 在 Golang 中反序列化模式字段

dictionary - 为什么 map 上的迭代是随机的?