如何在Go语言中获取结构体自定义类型字段的底层类型?
获取自定义类型的底层基本类型(Go反射)
我来帮你搞定这个问题!你遇到的情况是因为Role是基于int的自定义类型,反射时Type()返回的是自定义类型的全名(main.Role),但要拿到它的底层基本类型,咱们可以用反射类型的Underlying()方法来实现。
核心解决思路
reflect.Type类型提供了Underlying()方法,它会返回当前类型的底层类型。对于像Role这种基于基本类型定义的自定义类型,调用这个方法就能直接得到它的原始基本类型(也就是int)。
修改后的完整代码示例
package main import ( "fmt" "reflect" ) type Role int type User struct { Id int64 Name string Role Role } func ListFields(a interface{}) { v := reflect.ValueOf(a).Elem() for j := 0; j < v.NumField(); j++ { f := v.Field(j) n := v.Type().Field(j).Name kind := f.Kind().String() // 获取底层类型的字符串表示 underlyingType := f.Type().Underlying().String() // 保留原类型方便对比 originalType := f.Type().String() fmt.Printf("Name: %s Kind: %s Original Type: %s Underlying Type: %s\n", n, kind, originalType, underlyingType) } } func main() { var u User ListFields(&u) }
执行go run main.go后的输出
Name: Id Kind: int64 Original Type: int64 Underlying Type: int64 Name: Name Kind: string Original Type: string Underlying Type: string Name: Role Kind: int Original Type: main.Role Underlying Type: int
额外补充说明
- 其实你已经注意到了,
Kind()返回的是类型的分类(比如int、string),不管是不是自定义类型,所以Role的Kind本来就是int,如果只是需要判断它属于哪种基础类型分类,直接用Kind()就足够了。 - 如果你需要明确获取底层类型的字符串表示,或者要对底层类型做进一步的反射操作,
Underlying()方法就能帮你穿透自定义类型、类型别名等包装,拿到最原始的底层类型。
内容的提问来源于stack exchange,提问作者Neal
相关产品推荐
相关产品推荐

