从嵌套结构中获取标签

时间:2018-01-02 11:01:33

标签: go

假设我的结构看起来像:

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"`
    }
}

以下代码无法从嵌套结构部门

获取标记
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: 

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

1 个答案:

答案 0 :(得分: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

希望这有帮助。