You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:39:17