reflect.TypeOf获取变量类型,reflect.ValueOf获取变量值;前者用于类型判断和结构分析,后者用于动态读写值,二者常配合使用于反射操作。

在Go语言中,reflect.TypeOf 和 reflect.ValueOf 是反射机制中最常用的两个函数,它们都位于 reflect 包中,用于在运行时获取变量的类型和值信息。虽然它们经常一起使用,但用途和返回结果有本质区别。
reflect.TypeOf 返回的是一个 reflect.Type 接口,表示变量的静态类型。它告诉你“这个变量是什么类型”,比如 int、string 或自定义结构体。
例如:
var x int = 42 t := reflect.TypeOf(x) fmt.Println(t) // 输出:int
你还可以通过 Type 获取结构体字段名、方法列表等元信息:
立即学习“go语言免费学习笔记(深入)”;
在思高数码商城的基础上经过大量修改完善而成,引入了新的功能 此商城比较简洁,但功能完整。 1.支持产品多图:略图,小图,大图,多图。 2.市场价与热卖价对比。 3.注册与否均可购物。有很多人讨厌注册,这个功能正好迎合了这部分人的使用习惯。 4.除了常见商城的左侧分类树外,还有顶端分类菜单。 5.有友情链接模块。 6.大多功能均制作成独立模块 更新内容: 1.页顶分类菜单——老版本中需要手工修改页面
4
type Person struct {
Name string
Age int
}
p := Person{}
t := reflect.TypeOf(p)
for i := 0; i < t.NumField(); i++ {
fmt.Println(t.Field(i).Name)
}
// 输出:Name Age
reflect.ValueOf 返回的是一个 reflect.Value 类型的值,表示变量的实际数据。它关注的是“这个变量当前有什么值”,并允许你读取或修改该值(前提是可寻址且可设置)。
例如:
var x int = 42 v := reflect.ValueOf(x) fmt.Println(v.Int()) // 输出:42
如果你想修改值,需要传入指针:
x := 10
v := reflect.ValueOf(&x)
if v.Kind() == reflect.Ptr {
v = v.Elem() // 获取指针指向的值
}
if v.CanSet() {
v.SetInt(20)
}
fmt.Println(x) // 输出:20
TypeOf 判断结构,再用 ValueOf 修改字段值。ValueOf 返回的 reflect.Value 可以通过 .Type() 方法反向获取其类型,而 TypeOf 的结果无法直接拿到值。ValueOf 的变量如果是不可寻址的临时值,无法通过 SetXXX 修改。Elem() 解引用指针或接口前,需确认 Kind 是否为 Ptr 或 Interface。以上就是Golang reflect.TypeOf与ValueOf使用对比的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号