- 反射
- 反射解析结构体标签
- 结构体标签与 json
反射
reflect.TypeOf()
获取变量类型reflect.ValueOf()
获取变量的值inputType.Field(i)
获取域对象inputValue.Field(i).Interface()
获取域对象的值inputType.Method(i)
获取方法
注意事项:- 反射只能获取公有的域对象和方法,且方法的绑定不是指针运行结果:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51package main
import (
"fmt"
"reflect"
)
type User struct {
Id int
Name string
Age int
}
func (this User) Call() {
fmt.Println("user is called ..")
fmt.Printf("%v\n", this)
}
func main() {
user := User{1, "Aceld", 18}
DoFiledAndMethod(user)
}
func DoFiledAndMethod(input interface{}) {
//获取input的type
inputType := reflect.TypeOf(input)
fmt.Println("inputType is :", inputType.Name())
//获取input的value
inputValue := reflect.ValueOf(input)
fmt.Println("inputValue is:", inputValue)
//通过type 获取里面的字段
//1. 获取interface的reflect.Type,通过Type得到NumField ,进行遍历
//2. 得到每个field,数据类型
//3. 通过filed有一个Interface()方法等到 对应的value
for i := 0; i < inputType.NumField(); i++ {
field := inputType.Field(i)
value := inputValue.Field(i).Interface()
fmt.Printf("%s: %v = %v\n", field.Name, field.Type, value)
}
//通过type 获取里面的方法,调用
for i := 0; i < inputType.NumMethod(); i++ {
m := inputType.Method(i)
fmt.Printf("%s: %v\n", m.Name, m.Type)
}
}
解析结构体标签
1 | package main |
运行结果:
结构体标签与 json
json 编解码:
1 | package main |
运行结果: