英文:
Struct field names starting with a string
问题
我有一个Go结构体,并且我需要使用其中一个字段。然而,我现在只有一个字符串。我该如何将其转换为字段本身?
package main
import "fmt"
func main() {
type Point struct{
x int
y int
}
pt := Point{x:2, y:3}
a := "x"
fmt.Printf("%d", pt.a)
}
由于a = "x"
,我期望输出为pt.x = 2
。这是它打印出的错误信息:
$ go run point.go
# command-line-arguments
./point.go:14: pt.a undefined (type Point has no field or method a)
请注意,pt.a
是无效的,因为Point
结构体没有名为a
的字段或方法。要动态访问结构体字段,可以使用反射机制。你可以使用reflect
包来实现这一点。以下是一个示例:
package main
import (
"fmt"
"reflect"
)
func main() {
type Point struct {
x int
y int
}
pt := Point{x: 2, y: 3}
fieldName := "x"
value := reflect.ValueOf(pt)
field := value.FieldByName(fieldName)
if field.IsValid() {
fmt.Printf("%s: %d\n", fieldName, field.Int())
} else {
fmt.Printf("Field %s not found\n", fieldName)
}
}
这将输出:
x: 2
这样你就可以根据字段名动态获取结构体字段的值了。
英文:
I have a go struct and I need to work with one of the fields. However I am starting with a string. How do I case it to get the field itself.
package main
import "fmt"
func main() {
type Point struct{
x int
y int
}
pt := Point{x:2, y:3}
a := "x"
fmt.Printf("%s", pt.a)
}
Since a = "x"
I am expecting pt.x = 2
. Here's the error message it prints out. I am definitely starting with a string so I can't just remove the quotation marks.
$ go run point.go
# command-line-arguments
./point.go:14: pt.a undefined (type Point has no field or method a)
答案1
得分: 3
如果您需要访问一个以字符串形式给出名称的字段,您别无选择,只能使用反射。Go语言不像Python那样简单。:-)
这篇博客有一个很好的解释。
这里是反射包的文档。
但请注意,反射通常只应作为最后的选择。它会移除静态类型安全,并且对性能有害。
您真正需要什么?可能有一种方法可以满足您的需求而不使用反射。例如,如果您不需要将方法附加到结构体上,您可以使用map[string]int
。
英文:
If you need to access a field whose name is given as a string, you have no choice but to use reflection. Go ain't Python.
This blog has a nice explanation.
Here is the reflect package documentation.
But note that reflection should usually be used as a last resort only. It removes the static type safety and is detrimental for performance.
What are you really looking for? There may be a way to address your requirements without using reflection. For example, if you don't need methods attached to your struct, you could use map[string]int
.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论