【发布时间】:2016-12-20 10:42:37
【问题描述】:
在 Go 中,我想做这样的事情。我有一个包含许多结构的大对象(使用 Google 的 protobuf)。这是一个人为的例子:
person.name = "testing"
person.address.street = "123 test st"
person.address.city = "tester"
person.address.zip = 90210
person.billing.address.same = true
我希望能够动态引用事物。例如:
key := "person.address.zip"
fmt.Println("the value of key: " + key) // would like to get 90210
key := "person.address.city"
fmt.Println("the value of key: " + key) // would like to get "tester"
这在 Go 中可能吗?如果是这样,我该怎么做?本质上,我正在创建一个仅包含对象子集的报告,并且我希望能够创建一个映射文件,用户可以在其中将键/值映射在一起,并且我的程序将输出该值。我有这个在 python 中工作,但想尝试使用 Go :)
【问题讨论】:
-
是的,有可能。它为您提供包反射。反射的缺点通常是工作量大。另一方面 - 没有反射就无法编写像 html/template 或 text/template 这样完美的包,其中的写作风格类似于解释语言(如 python),尽管 go 已编译。
-
而且反射很慢,应该是最后的手段。
-
如果你真的需要这样的东西,你应该使用(嵌套)映射,而不是结构值的层次结构。
-
像
map[string]interface{}这样的嵌套地图是你的朋友
标签: variables dynamic go reflection go-reflect