簡體   English   中英

使用 Go 獲取結構字段標記反映 package

[英]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://play.golang.org/p/Sb0i7za5Uow

列出結構中所有標簽的簡潔方法(使用外部庫)。

外部庫: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM