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