Golang中如何检测struct结构体是否包含未导出字段?
实现方案
可以用Go标准库的reflect反射包实现该功能,核心判断逻辑依赖结构体字段的PkgPath属性:Go中首字母小写的未导出结构体字段,反射得到的StructField.PkgPath会返回其所属包的路径,导出字段的该属性为空字符串,只需遍历所有结构体字段检查该属性即可。
完整实现代码如下:
package main import ( "fmt" "reflect" ) type Person struct { Name string DOB string age int } func detectUnexportedInStruct(i interface{}) bool { // 处理指针类型,解引用拿到实际结构体值 val := reflect.ValueOf(i) if val.Kind() == reflect.Ptr { val = val.Elem() } // 非结构体类型直接返回false,可按需调整该逻辑 if val.Kind() != reflect.Struct { return false } typ := val.Type() // 遍历所有结构体字段 for i := 0; i < typ.NumField(); i++ { field := typ.Field(i) // PkgPath非空说明是未导出字段 if field.PkgPath != "" { return true } } return false } func main() { fmt.Println(detectUnexportedInStruct(Person{Name: "", DOB: ""})) // 输出true,符合预期 }
上述实现同时兼容直接传结构体、传结构体指针的场景,非结构体入参默认返回false,你可以根据实际需求调整这部分的处理逻辑。
内容的提问来源于stack exchange,提问作者Tushar Das
相关产品推荐
相关产品推荐

