什么是印刷方式" 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())
}
答案 0 :(得分:48)
你想要val.Type().Field(0).Name
。 Field
上的reflect.Type
方法将返回描述该字段的结构,其中包括名称以及其他信息。
无法检索表示特定字段值的reflect.Value
的字段名称,因为这是包含结构的属性。
答案 1 :(得分:18)
您需要获取类型定义的字段而不是值。
http://play.golang.org/p/7Bc7MJikbJ
package main
import "fmt"
import "reflect"
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.Type().Field(0).Name)
}
答案 2 :(得分:17)
使用structs包的新Names
方法,它更容易:
package main
import (
"fmt"
"github.com/fatih/structs"
)
type A struct {
Foo string
Bar int
}
func main() {
names := structs.Names(&A{})
fmt.Println(names) // ["Foo", "Bar"]
}
答案 3 :(得分:10)
我认为更好的方法是获得田地'结构中的名称是
func main() {
a := &A{Foo: "afoo"}
val := reflect.ValueOf(a).Elem()
for i:=0; i<val.NumField();i++{
fmt.Println(val.Type().Field(i).Name)
}
}
有两个提示:
.Elem()
之后使用reflect.ValueOf(a)
,因为在您的情况下,a是指针。val.Field(i).Type().Name
与val.Type().Field(i).Name
完全不同。后者可以在struct 希望它有用..
答案 4 :(得分:1)
您也可以使用https://github.com/fatih/structs
// Convert the fields of a struct to a []*Field
fields := s.Fields()
for _, f := range fields {
fmt.Printf("field name: %+v\n", f.Name())
}
答案 5 :(得分:0)
package main
import "fmt"
import "reflect"
type A struct {
Foo string
}
func (a *A) PrintFoo() {
fmt.Println("Foo value is " + a.Foo)
}
func main() {
a := &A{Foo: "afoo"}
//long and bored code
t := reflect.TypeOf(*a)
if t.Kind() == reflect.Struct {
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Name)
}
} else {
fmt.Println("not a stuct")
}
//shorthanded call
fmt.Println(reflect.TypeOf(*a).Field(0).Name)//can panic if no field exists
}