reflect
@
目录
- 写在前面
- reflect.TypeOf(): 获取任何值的类型信息。
- reflect.ValueOf(): 获取任何值的反射值对象。
- [reflect]
- reflect.Value.Interface(): 将反射值转换回接口类型,通常用于类型断言。
- reflect.Value.Set(): 设置可设置的值的新值。
- reflect.Value.Addr(): 获取可寻址的值的地址。
- reflect.New(): 根据给定的类型创建一个新值。
- reflect.DeepEqual(): 深度比较两个值是否相等。
- reflect.Value.CanAddr(): 检查值是否可寻址。
- reflect.Value.CanSet(): 检查值是否可设置。
- reflect.Value.Elem(): 获取指针、切片、映射、通道、数组或接口的基础元素值。
- reflect.MakeSlice(): 创建一个新的切片。
- 参考资料
写在前面
Go 语言的 reflect 包提供了强大的工具来在运行时检查和操纵变量的类型和值。以下是一些常用的 reflect 方法,以及如何使用它们的示例和对应的输出结果:
reflect.TypeOf(): 获取任何值的类型信息。
var x float64 = 3.4
fmt.Println("Type:", reflect.TypeOf(x)) // 输出: Type: float64
reflect.ValueOf(): 获取任何值的反射值对象。
fmt.Println("Value:", reflect.ValueOf(x)) // 输出: Value: 3.4
reflect.Value.Kind(): 获取反射值的种类(基础类型)。
[reflect]
v := reflect.ValueOf(x)
fmt.Println("Kind is float64:", v.Kind() == reflect.Float64) // 输出: Kind is float64: true
reflect.Value.Interface(): 将反射值转换回接口类型,通常用于类型断言。
y := v.Interface().(float64)
fmt.Println("interface value:", y) // 输出: interface value: 3.4
reflect.Value.Set(): 设置可设置的值的新值。
var y float64 = 4.5
r := reflect.ValueOf(&y).Elem()
r.SetFloat(3.1415)
fmt.Println("y:", y) // 输出: y: 3.1415
reflect.Value.Addr(): 获取可寻址的值的地址。
var z int = 10
v := reflect.ValueOf(&z).Elem()
p := v.Addr().Interface().(*int)
fmt.Println("Address of z:", p, "Value of z:", *p) // 输出: Address of z: 0xc0000b2008 Value of z: 10
reflect.New(): 根据给定的类型创建一个新值。
t := reflect.TypeOf(x)
newPtr := reflect.New(t)
newPtr.Elem().SetFloat(7.8)
fmt.Println("New value:", newPtr.Elem().Interface()) // 输出: New value: 7.8
reflect.DeepEqual(): 深度比较两个值是否相等。
a := map[int]string{1: "one"}
b := map[int]string{1: "one"}
fmt.Println("a is deep equal to b:", reflect.DeepEqual(a, b)) // 输出: a is deep equal to b: true
reflect.Value.CanAddr(): 检查值是否可寻址。
fmt.Println("v is addressable:", v.CanAddr()) // 输出: v is addressable: false
reflect.Value.CanSet(): 检查值是否可设置。
fmt.Println("Can set v:", r.CanSet()) // 输出: Can set v: true
reflect.Value.Elem(): 获取指针、切片、映射、通道、数组或接口的基础元素值。
var ptr *float64 = new(float64)
*ptr = 3.14
ptrVal := reflect.ValueOf(ptr)
fmt.Println("Element of ptr:", ptrVal.Elem().Interface()) // 输出: Element of ptr: 3.14
reflect.MakeSlice(): 创建一个新的切片。
sliceType := reflect.TypeOf([]int{})
newSlice := reflect.MakeSlice(sliceType, 3, 3)
newSliceIndex0 := newSlice.Index(0)
newSliceIndex0.SetInt(10)
fmt.Println("New slice with set first element:", newSlice.Interface()) // 输出: New slice with set first element: [10 0 0]
这些方法是 reflect 包中最常用的一些,它们使得你能够在运行时动态地处理和操作类型和值。
参考资料
基础/标准库/第三方库
golang 导航
编程规范
算法|面试
项目
免责声明:
本站提供的资源,都来自网络,版权争议与本站无关,所有内容及软件的文章仅限用于学习和研究目的。不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负,我们不保证内容的长久可用性,通过使用本站内容随之而来的风险与本站无关,您必须在下载后的24个小时之内,从您的电脑/手机中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。侵删请致信