package main
import (
_ "a1/utils"
"fmt"
"reflect"
)
func reflectTest01(b interface{}) {
// 通过反射获取传入变量的 type、kind、值
rTyp := reflect.TypeOf(b)
fmt.Println(rTyp) // int
rVal := reflect.ValueOf(b)
fmt.Println(rVal) // 100
// aa := 10
fmt.Printf("rVal type: %T, value: %v\n", rVal, rVal)
// rVal type: reflect.Value, value: 100
// bb := aa + int(rVal.Int())
bb := 10 + rVal.Int()
fmt.Println(bb) // 110
// 将rVal转成 interface{}
iV := rVal.Interface()
// 将interface{} 通过断言转成需要的类型
num2 := iV.(int)
fmt.Printf("num2 type: %T, value: %v\n", num2, num2)
// num2 type: int, value: 100
fmt.Println(num2) // 100
}
func reflectTest02(b interface{}) {
// 通过反射获取传入变量的 type、kind、值
rTyp := reflect.TypeOf(b)
fmt.Println(rTyp) // main.Student
rVal := reflect.ValueOf(b)
fmt.Println(rVal) // {tom 20}
fmt.Printf("rVal type: %T, value: %v\n", rVal, rVal)
// rVal type: reflect.Value, value: {tom 20}
// 将rVal转成 interface{}
iV := rVal.Interface()
fmt.Printf("iV type: %T, value: %v\n", iV, iV)
// iV type: main.Student, value: {tom 20}
// 将interface{} 通过断言转成需要的类型
num2 := iV.(Student)
fmt.Printf("num2 type: %T, value: %v\n", num2, num2)
// num2 type: main.Student, value: {tom 20}
fmt.Println(num2) // {tom 20}
fmt.Println(num2.Name) // tom
}
type Student struct {
Name string
Age int
}
// 通过反射 + 指针 修改值
func reflectTest03(b interface{}) {
rVal := reflect.ValueOf(b)
fmt.Printf("rVal kind=%v\n",rVal.Kind())
rVal.Elem().SetInt(20)
}
func main() {
// 基本数据类型 interface{} reflect.Value 进行反射的基本操作
var num int = 100
reflectTest01(num)
fmt.Println("****************")
stu := Student{
Name: "tom",
Age: 20,
}
reflectTest02(stu)
fmt.Println("****************")
var num11 int = 10
reflectTest03(&num11)
fmt.Println(num11)
// fmt.Println("main线程退出")
}
go 反射的练习
最新推荐文章于 2024-06-13 10:18:16 发布