假设我的结构看起来像:
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:
有没有办法从嵌套结构中获取标签?感谢。
答案 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
希望这有帮助。