从嵌套结构中获取标签

问题描述 投票:1回答:1

假设我有一个结构看起来像:

type Employee struct {
    ID        uint32    `json:"id" sql:"id"`
    FirstName string    `json:"first_name" sql:"first_name"`
    LastName  string    `json:"last_name" sql:"last_name"`
    Department struct {
        Name string `json:"name" sql:"name"`
        Size int `json:"size" sql:"size"`
    }
}

下面的代码无法从嵌套的struct Department获取标记

func main(){
    t := reflect.TypeOf(&Employee{}).Elem()
    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        column := field.Tag.Get("sql")
        fmt.Println("column: ", column)
    }
}

结果:

column:  id
column:  first_name
column:  last_name
column: 

有没有办法从嵌套结构中获取标签?谢谢。

go
1个回答
5
投票

嗨,新年快乐!

您的部门子结构本身没有标签,您试图打印它们。

您的代码应该考虑在循环中检查的字段可以是struct本身并相应地下降到它。

这是标签打印机的简单递归版本:

func printTags(t reflect.Type) {
    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)

        if field.Type.Kind() == reflect.Struct {
            printTags(field.Type)
            continue
        }

        column := field.Tag.Get("sql")
        fmt.Println("column: ", column)
    }
}

func main() {
    printTags(reflect.TypeOf(&Employee{}).Elem())
}

然后你有输出:

column:  id
column:  first_name
column:  last_name
column:  name
column:  size

希望这可以帮助。

© www.soinside.com 2019 - 2024. All rights reserved.