![](/img/trans.png)
[英]Struct field tag `name` not compatible with reflect.StructTag.Get: bad syntax for struct tag pair
[英]Get struct field tag using Go reflect package
是否可以反映結構的字段並獲取對其標記值的引用?
例如:
type User struct {
name string `json:name-field`
age int
}
// ...
user := &User{"John Doe The Fourth", 20}
getStructTag(user.name)
// ...
func getStructTag(i interface{}) string{
//get tag from field
}
據我所知,通常的方法是在typ.NumField()
范圍內,然后調用field.Tag.Get("tagname")
。
但是,在我的用例中,最好不必傳入整個結構。
您不需要傳入整個結構體,但僅傳入其中一個字段的值是不夠的。
在您的示例中, user.name
字段只是一個string
- 反射包無法將其關聯回原始結構。
相反,您需要傳遞給定字段的reflect.StructField
:
field, ok := reflect.TypeOf(user).Elem().FieldByName("name")
…
tag = string(field.Tag)
注意:我們在上面使用Elem
是因為user
是一個指向結構體的指針。
修改上面的答案可以給出特定標簽的值
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string `json:"name_field"`
Age int
}
func main() {
user := &User{"John Doe The Fourth", 20}
field, ok := reflect.TypeOf(user).Elem().FieldByName("Name")
if !ok {
panic("Field not found")
}
fmt.Println(getStructTag(field, "json")) //name_field
}
func getStructTag(f reflect.StructField, tagName string) string {
return string(f.Tag.Get(tagName))
}
列出結構中所有標簽的簡潔方法(使用外部庫)。
外部庫: https://github.com/fatih/structs
示例: https://go.dev/play/p/C_yXMdbFYAq
package main
import (
"fmt"
"github.com/fatih/structs"
)
type User struct {
Name string `json:"name_field"`
Age int `json:"age_field"`
}
func main() {
user := &User{}
fields := structs.Fields(user)
for _, field := range fields {
tag := field.Tag("json")
fmt.Println(tag)
}
}
結果:
name_field
age_field
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.