Golang 获取特定结构字段名称的字符串表示

标签 go reflection field-names

我真的想要一种在 go 中打印字段名称的字符串表示形式的方法。它有几个用例,但这里有一个例子:

假设我有一个结构

type Test struct {
    Field      string `bson:"Field" json:"field"`
    OtherField int    `bson:"OtherField" json:"otherField"`
}

例如,我想做一个 mongo 查找:

collection.Find(bson.M{"OtherField": someValue})

我不喜欢我必须把字符串“OtherField”放在那里。错误输入或结构更改似乎很脆弱且容易,然后我的查询在我不知情的情况下失败。

有没有办法在不必声明 const 或类似的东西的情况下获取字符串“OtherField”?我知道我可以使用反射从结构中获取字段名称列表,但我真的很想按照

fieldName := nameOf(Test{}.OtherField) 
collection.Find(bson.M{fieldName: someValue})

有没有办法在 Go 中做到这一点? C# 6 具有内置的 nameof,但通过反射挖掘我找不到在 Go 中执行此操作的任何方法。

最佳答案

我真的不认为有。您可以通过反射加载一组类型,并为字段名称生成一组常量。所以:

type Test struct {
    Field      string `bson:"Field" json:"field"`
    OtherField int    `bson:"OtherField" json:"otherField"`
}

可以生成如下内容:

var TestFields = struct{
      Field string
      OtherField string
}{"Field","OtherField"}

并且您可以将 TestFields.Field 用作常量。

不幸的是,我不知道有任何现有工具可以执行类似的操作。做起来相当简单,不过连接到 go generate

编辑:

我如何生成它:

  1. 制作一个接受 reflect.Typeinterface{} 数组的包,并输出一个代码文件。
  2. 使用 main 函数在我的仓库中的某处创建一个 generate.go:

    func main(){
       var text = mygenerator.Gen(Test{}, OtherStruct{}, ...)
       // write text to constants.go or something
    }
    
  3. //go:generate go run scripts/generate.go 添加到我的主应用程序并运行 go generate

关于Golang 获取特定结构字段名称的字符串表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43791574/

相关文章:

json - 在 Go 中将映射转换为字符串

go - 如何使用 golang 和 labstack echo 处理对多个服务的代理

go - 构建自定义的Go插件

C#如何获取正在设置的属性的名称

c++ - C++中的“Poor Man'反射”(又名自下而上的反射)

Pythonic 按字段名称对命名元组列表进行排序的方法

go - undefined reference to error 仅针对某些函数

java - 按属性对集合进行排序,以字符串形式给出

mysql 到 CSV,第一行的列名动态插入