go-反射

反射在php 中的应用场景主要是依赖注入的时候,通过控制器在调用函数的时候对于传入参数 class 类名的限制,自动从di容器中取出对应class 的单例类实体,方便我们在使用的时候不需要主动传入。

go中反射的使用当然包含上述依赖注入的场景,目前我接触到的场景就是struct 中tag 的使用,比如struct 在json string 中 对于json属性名的自动转小写。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
type Name struct{
name string
}

a := Name{"111"}

r := reflect.TypeOf(a) // 返回一个type 类型
r.NumField() // 返回属性的个数
r.Field(i) // 返回第i 个属性
r.Name() // 获取属性的名称
r.Kind() // 获取属性的类别 ,比如自定义结构体叫myStruct, kind 返回 struct, name 返回myStruct

// 对于地址类型
r := reflect.TypeOf(a).Elem() // 返回一个type类型,我们就能愉快的使用接下来的那些方法了


v := reflect.ValueOf(a) // 返回一个value 类型 ,(把类型和值分开了,虽然感觉很奇怪)
v.Field(i) 这个返回的类型和上面type 的类型还不一样,上面的那个可以获取tag等属性


// 还有个很重要的就是函数的反射

func Sum(a int, b int) int {
return a + b
}

p := reflect.ValueOf(Sum)

// 注意call 调用的时候必须是[]value, 然后单个value 可以用ValueOf 来返回
p.Call(reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)})
坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------