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

sat*_*sat 47 go

在这里打印"Foo"的方式是什么?在这个例子中,打印的是"字符串".

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())
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*dge 58

你想要的val.Type().Field(0).Name.该Field方法对reflect.Type将返回描述该字段,该字段包括名称,以及其它的信息的结构.

无法检索reflect.Value表示特定字段值的字段名称,因为这是包含结构的属性.


fab*_*ioM 19

您需要获取类型定义的字段而不是值.

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的例子,但你的答案缺乏解释。 (3认同)

Fat*_*lan 19

使用结构的新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"]
}
Run Code Online (Sandbox Code Playgroud)

  • 您可能应该提到这是您自己的包裹。 (8认同)
  • 提到那是我自己的包裹吗?包名称本身已经有我的名字,我不知道还能如何告诉:) (4认同)
  • 该软件包不再维护 (2认同)

Osc*_*989 15

我认为在结构中获取字段名称的更好方法是

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

有两个提示:

  1. .Elem()在你之后使用reflect.ValueOf(a),因为在你的情况下,a是一个指针.
  2. val.Field(i).Type().Name完全不同于val.Type().Field(i).Name.后者可以获得结构中字段的名称

希望它有用..