如何通过Go语言反射获取嵌套结构体中的SQL标签?
获取Go嵌套结构体的标签值
你的问题很典型——当前代码只遍历了顶层结构体的直接字段,当遇到Department这种嵌套结构体类型的字段时,没有深入解析它的内部字段,所以才会输出空值。当然有办法获取嵌套结构体里的标签,下面给你两种实用方案:
方案一:递归遍历所有嵌套字段(通用型)
如果你的结构体可能有多层嵌套,递归遍历是最稳妥的方式,能处理任意深度的嵌套结构。示例代码如下:
package main import ( "fmt" "reflect" ) 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"` } } // 递归遍历结构体字段,提取sql标签 func extractSQLTags(t reflect.Type) { for i := 0; i < t.NumField(); i++ { field := t.Field(i) // 先尝试获取当前字段的sql标签 if column := field.Tag.Get("sql"); column != "" { fmt.Println("column: ", column) } // 判断当前字段是否为结构体类型(且不是指针类型的结构体) if field.Type.Kind() == reflect.Struct { // 递归处理嵌套结构体 extractSQLTags(field.Type) } // 如果是结构体指针,需要先获取Elem()再递归 if field.Type.Kind() == reflect.Ptr && field.Type.Elem().Kind() == reflect.Struct { extractSQLTags(field.Type.Elem()) } } } func main(){ t := reflect.TypeOf(&Employee{}).Elem() extractSQLTags(t) }
这段代码会递归检查每个字段的类型:
- 如果是普通字段,直接提取
sql标签 - 如果是结构体或结构体指针,就深入进去遍历它的内部字段,继续提取标签
运行后输出会是:
column: id column: first_name column: last_name column: name column: size
方案二:直接处理单层嵌套(简易型)
如果你的结构体只有一层嵌套,不需要考虑多层的情况,可以直接在遍历顶层字段时,判断字段类型是否为Department结构体,然后单独处理它的字段:
func main(){ t := reflect.TypeOf(&Employee{}).Elem() for i := 0; i < t.NumField(); i++ { field := t.Field(i) column := field.Tag.Get("sql") if column != "" { fmt.Println("column: ", column) } // 判断当前字段是否是Department结构体 if field.Name == "Department" && field.Type.Kind() == reflect.Struct { deptType := field.Type for j := 0; j < deptType.NumField(); j++ { deptField := deptType.Field(j) if deptColumn := deptField.Tag.Get("sql"); deptColumn != "" { fmt.Println("column: ", deptColumn) } } } } }
这种写法更简单,但只适用于固定的单层嵌套场景,灵活性不如递归方案。
内容的提问来源于stack exchange,提问作者khue bui
相关产品推荐
相关产品推荐

