使用反射获取struct字段的名称

时间:2014-06-21 00:17:16

标签: go

什么是印刷方式" 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())
}

6 个答案:

答案 0 :(得分:48)

你想要val.Type().Field(0).NameField上的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)
    }
}

有两个提示:

  1. .Elem()之后使用reflect.ValueOf(a),因为在您的情况下,a是指针。
  2. val.Field(i).Type().Nameval.Type().Field(i).Name完全不同。后者可以在struct
  3. 中获取字段的名称

    希望它有用..

答案 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

}