我真的想要一种在 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
。
编辑:
我如何生成它:
- 制作一个接受
reflect.Type
或interface{}
数组的包,并输出一个代码文件。 使用 main 函数在我的仓库中的某处创建一个
generate.go
:func main(){ var text = mygenerator.Gen(Test{}, OtherStruct{}, ...) // write text to constants.go or something }
- 将
//go:generate go run scripts/generate.go
添加到我的主应用程序并运行go generate
关于Golang 获取特定结构字段名称的字符串表示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43791574/