Go 获取带有反射的结构标记-错误:类型反射。值没有字段或方法标记

Go 获取带有反射的结构标记-错误:类型反射。值没有字段或方法标记,go,struct,reflection,introspection,Go,Struct,Reflection,Introspection,假设我们有: 主程序包 进口( “fmt” “反映” “字符串” ) 类型MyStruct struct{ Str string`gorm:“大小:10”json:“字符串”` } func main(){ aStruct:=MyStruct{“Hello”} s:=reflect.ValueOf(&aStruct.Elem()) 如果s.Kind()==reflect.Struct{ 对于i:=0;i

假设我们有:

主程序包
进口(
“fmt”
“反映”
“字符串”
)
类型MyStruct struct{
Str string`gorm:“大小:10”json:“字符串”`
}
func main(){
aStruct:=MyStruct{“Hello”}
s:=reflect.ValueOf(&aStruct.Elem())
如果s.Kind()==reflect.Struct{
对于i:=0;i
错误是:

go run test1.go 
# command-line-arguments
./test1.go:22:22: field.Tag undefined (type reflect.Value has no field or method Tag)
按照go 1.14.6和go 1.15.2进行测试

据我所知,我需要将
reflect.Value
转换为
reflect.StructField
你知道怎么做吗?

标记属于结构的字段类型,而不是结构类型的值

返回值的包装,而不是其类型。要获取标记值,您需要从类型的包装开始,例如,通过以下方式获取:

以及循环中字段的类型包装器(类型为):

并使用
fieldt
获取标签:

gormTag := fieldt.Tag.Get("gorm") // No error, this works
通过此添加,输出将是(在上尝试):

见相关文件:

field := s.Field(i)
fieldt := t.Field(i)
gormTag := fieldt.Tag.Get("gorm") // No error, this works
reflect.Value
10