mirror of
https://gitee.com/shikong-sk/golang-study
synced 2025-02-22 23:12:15 +08:00
docs: reflect 反射
This commit is contained in:
parent
851c81dd52
commit
ceea6dd095
57
base/reflect/main.go
Normal file
57
base/reflect/main.go
Normal file
@ -0,0 +1,57 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"reflect"
|
||||
)
|
||||
|
||||
// 反射
|
||||
|
||||
type Person struct {
|
||||
Name string `json:"name"`
|
||||
Age int `json:"age"`
|
||||
}
|
||||
|
||||
func main() {
|
||||
str := `{"name":"张三","age":18}`
|
||||
var p Person
|
||||
// json 序列化 与 反序列化 使用了反射实现
|
||||
_ = json.Unmarshal([]byte(str), &p)
|
||||
fmt.Printf("%+v\n", p)
|
||||
|
||||
// 通过 反射 获取 动态类型
|
||||
t := reflect.TypeOf(p)
|
||||
fmt.Printf("动态类型: %s\n", t)
|
||||
fmt.Printf("名称: %s\n", t.Name())
|
||||
fmt.Printf("种类: %s\n", t.Kind())
|
||||
fmt.Printf("是否为 指针 %t\n", t.Kind() == reflect.Ptr)
|
||||
// NumField 获取字段数
|
||||
for i := 0; i < t.NumField(); i++ {
|
||||
// 获取字段信息
|
||||
field := t.Field(i)
|
||||
fmt.Printf("字段名: %s, 字段类型: %s, Tag: %s\n", field.Name, field.Type, field.Tag)
|
||||
}
|
||||
|
||||
fmt.Println("=========================================================")
|
||||
|
||||
// 通过 反射 获取 原始值信息
|
||||
// ValueOf 的 返回值为 Value 类型
|
||||
i := 10086
|
||||
v := reflect.ValueOf(&i)
|
||||
if v.Kind() != reflect.Ptr {
|
||||
fmt.Println("要 通过 反射 修改值 必须 传入一个 指针变量")
|
||||
return
|
||||
}
|
||||
// 通过 Elem 获取指针对应的值
|
||||
fmt.Printf("值: %v\n", v.Elem())
|
||||
// 获取 值 类型种类
|
||||
k := v.Elem().Kind()
|
||||
switch k {
|
||||
case reflect.Int:
|
||||
fmt.Printf("值类型: %s, 值: %d\n", reflect.Int, v.Elem().Int())
|
||||
v.Elem().SetInt(10010)
|
||||
}
|
||||
|
||||
fmt.Printf("通过反射修改后的值为: %d\n", i)
|
||||
}
|
Loading…
Reference in New Issue
Block a user