Go 使用反射获取结构字段的名称

Go 使用反射获取结构字段的名称,go,Go,在这里打印“Foo”的方式是什么?在本例中,打印的是“字符串” 您需要val.Type().Field(0).Name。reflect.Type上的字段方法将返回一个描述该字段的结构,其中包括名称和其他信息 无法检索表示特定字段值的reflect.Value的字段名,因为这是包含结构的属性。您需要获取类型定义的字段,而不是值的字段 你也可以使用 有了新的名称软件包方法,它更容易: package main import ( "fmt" "github.com/fatih/

在这里打印“Foo”的方式是什么?在本例中,打印的是“字符串”

您需要
val.Type().Field(0).Name
reflect.Type上的
字段
方法将返回一个描述该字段的结构,其中包括名称和其他信息


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

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

你也可以使用


有了新的
名称
软件包方法,它更容易:

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"]
}

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

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)
    }
}
func main(){
a:=&a{Foo:afoo}
val:=reflect.ValueOf(a).Elem()
对于i:=0;i
package main
输入“fmt”
导入“反映”
类型A结构{
Foo字符串
}
func(a*a)PrintFoo(){
fmt.Println(“Foo值为”+a.Foo)
}
func main(){
a:=&a{Foo:afoo}
//冗长乏味的代码
t:=反射类型(*a)
如果t.Kind()==reflect.Struct{
对于i:=0;i
“无法检索表示特定字段值的反射值的字段名”-为什么会这样?字段本身不是类型和名称的一部分吗?@sat一旦您有了特定字段的
reflect.Value
,它与任何其他变量都没有区别。只有结构体有关于其字段的信息。@sat:在您的示例中,
val.field(0)
与任何其他字符串的
reflect.Value
没有什么不同。它不“记住”它是结构的一部分。@JamesHenstridge-但我并不需要它记住它属于结构。我只想打印使用反射的字段本身的变量名(无论它是否是结构的一部分)。很抱歉,如果这真的是一个新手问题,那就是:变量没有名字——它只是内存中的一个位置。很好的示例,但您的答案缺少解释。您可能应该提到它是您自己的包。@swdon Fatih Arslan构建库时,它几乎与标准库一样。提到这是我自己的包?包e name本身已经有了我的名字,我不知道还能怎么说:)这个包不再维护
// Convert the fields of a struct to a []*Field
fields := s.Fields()

for _, f := range fields {
    fmt.Printf("field name: %+v\n", f.Name())
}
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"]
}
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)
    }
}
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

}