reflect

发布时间 2023-12-12 10:27:51作者: Nones

@


写在前面

  • 相关博文
  • 个人博客首页
  • 免责声明:仅供学习交流使用!开源框架可能存在的风险和相关后果将完全由用户自行承担,本人不承担任何法律责任。

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 导航


编程规范


算法|面试


项目