Go中获取变量字段类型和Kind需用reflect包:Type代表静态声明类型,Kind返回底层类别(如struct、ptr);须先校验interface{}有效性,遍历结构体时仅导出字段可反射访问。

在 Go 中,要获取变量的字段类型和 Kind,核心是使用 reflect 包。它能让你在运行时检查任意值的类型信息、结构体字段、指针目标、切片元素等。关键不是“获取类型名字符串”,而是理解 Type 和 Kind 的区别,并正确使用反射入口。
用 reflect.TypeOf 获取 Type,再调 Kind()
reflect.TypeOf 返回一个 reflect.Type 接口,代表该值的**静态声明类型**;而 Type.Kind() 返回的是该类型的**底层类别**(如 struct、ptr、slice、int 等)。注意:指针、切片、映射等复合类型,其 Kind 和 Name() 不同。
-
var x *string→Type.String() == "*string",但Kind() == reflect.Ptr -
var y []int→Type.String() == "[]int",但Kind() == reflect.Slice -
type MyInt int,var z MyInt→Type.Name() == "MyInt",Kind() == reflect.Int
处理 interface{} 和 nil 值要先判断有效性
对 interface{} 变量做反射前,必须确保它不为 nil,否则 reflect.TypeOf 返回 nil,调用方法会 panic。安全做法是:
- 用
reflect.ValueOf(v).IsValid()判断值是否有效(非 nil interface 或零值) - 对
interface{},推荐先用reflect.ValueOf(v)得到Value,再用.Type()或.Kind() - 若需解引用(如处理
*T),用.Elem()前务必检查.Kind() == reflect.Ptr && .IsNil() == false
遍历结构体字段:获取名称、类型、Kind 和标签
对 struct 类型,可用 Type.NumField() 和 Type.Field(i) 获取每个字段的元信息:
立即学习“go语言免费学习笔记(深入)”;
-
field.Type是字段的类型(reflect.Type),可继续调.Kind() -
field.Name是导出字段名(非导出字段返回空字符串) -
field.Tag.Get("json")可读取 struct tag(如`json:"name"`) - 注意:只有导出字段(大写开头)才能被反射访问;私有字段无法获取
区分 Type.Name() 和 Type.Kind().String()
Type.Name() 返回类型定义的名字(仅对命名类型有效,如 type Person struct{} 返回 "Person"),而匿名类型(如 struct{ Name string })返回空字符串;Kind().String() 总是返回底层类别,稳定可靠。
- 优先用
Kind()判断逻辑分支(比如“如果是 slice 就遍历”、“如果是 ptr 就解引用”) - 用
Type.String()作调试输出更直观(显示完整类型字面量) - 用
Type.Name()仅当需要识别自定义类型名且确定其已命名










