这里打印“Foo”的方式是什么?在这个例子中,打印的是“string”。
http://play.golang.org/p/ZnK6PRwEPp
type A struct {
Foo string
}
func (a *A) PrintFoo() {
fmt.Println("Foo value is " + a.Foo)
}
func main() {
a := &A{Foo: "afoo"}
val := reflect.Indirect(reflect.ValueOf(a))
fmt.Println(val.Field(0).Type().Name())
}
7条答案
按热度按时间suzh9iv81#
您需要
val.Type().Field(0).Name
。reflect.Type
上的Field
方法将返回一个描述该字段的结构体,其中包括名称和其他信息。没有办法检索表示特定字段值的
reflect.Value
的字段名,因为这是包含结构的属性。ghhaqwfi2#
我认为在结构中获取字段名称的更好方法是
这里有两个提示:
1.在
reflect.ValueOf(a)
之后使用.Elem()
,因为在您的示例中,a是指针。val.Field(i).Type().Name
与val.Type().Field(i).Name
完全不同,后者可以获取结构体中字段的名称希望对大家有帮助。
如果您想查看更多案例,请查看my 2mins article
niwlg2el3#
您需要获取类型定义的字段,而不是值的字段。
http://play.golang.org/p/7Bc7MJikbJ
bvhaajcl4#
请注意,此解决方案引用了一个Go模块,该模块现已弃用,并且不再维护。它已于 * 2018年10月11日 * 弃用。
使用structs包的新
Names
方法,这就更简单了:jdg4fx2g5#
8fq7wneg6#
也可以使用https://github.com/fatih/structs
9bfwbjaz7#
你可以使用这个函数,它以
struct
作为第一个参数,然后是它的fields
。它返回map
类型,使用起来很方便如果使用来自另一个结构的字段,则不会发生任何情况
如果尝试使用
different type
,则会导致panic
请注意,根据列表,字段具有序号(从0开始)。结构中的所有字段必须以
uppercase
开始完整示例和playground