赞
踩
总结:
1. go语言支持反射即reflect,核心包括两方面:类型(reflect.Type)、值(reflect.Value)
2. reflect 可以获取到变量、结构体的类型和值
3. reflect 可以根据类型(reflect.Type)新产生一个对象
实验如下图
代码如下:
- package main
-
- import (
- "fmt"
- "reflect"
- )
-
- // 自定义结构体
- type User struct {
- ID int32
- Name string
- }
- func (u User) GetName() string {
- return u.Name
- }
-
- // 接口:人
- type Person interface {
- GetHP() int32
- }
- // 男人
- type Man struct {
- }
- func (m Man) GetHP() int32 {
- return 100
- }
- // 女人
- type Woman struct {
- }
- func (w Woman) GetHP() int32 {
- return 200
- }
-
- func main() {
- 基本类型 //
- fmt.Println("整形")
- var a int = 555
- fmt.Println(reflect.TypeOf(a))
- fmt.Println(reflect.ValueOf(a)) // Valueof()就是取变量的值
- fmt.Println("")
-
- fmt.Println("字符串")
- fmt.Println(reflect.TypeOf("999"))
- fmt.Println(reflect.ValueOf("999")) // Valueof()就是取变量的值
- fmt.Println("")
-
- fmt.Println("数组")
- arr := []int32{1, 2, 3}
- fmt.Println(reflect.TypeOf(arr))
- fmt.Println(reflect.ValueOf(arr)) // Valueof()就是取变量的值
- fmt.Println("")
-
- 自定义结构体 //
- fmt.Println("自定义结构体")
- // 自定义结构体
- user1 := User{}
- fmt.Println(reflect.TypeOf(user1))
- fmt.Println(reflect.ValueOf(user1))
-
- // 根据类型new一个结构体, 步骤如下
- // 1. 得到类型reflect.Type
- // 2. 根据类型new一个reflect.Value,再转为Interface
- // 3. Interface转为相应的对象指针
- userTy := reflect.TypeOf(user1)
- newInterface := reflect.New(userTy).Interface()
- newUser := newInterface.(*User)
- newUser.ID = 123
- newUser.Name = "123"
- fmt.Printf("根据reflect.Type新建的User对象内容:%v", newUser)
-
- // 自定义结构体的函数
- fmt.Println(reflect.TypeOf(user1).MethodByName("GetName")) // 返回该函数的形式
- fmt.Println(reflect.ValueOf(user1).MethodByName("GetName")) // 返回该函数在内存中的真实地址
- fmt.Println("")
-
- 接口 //
- fmt.Println("自定义结构体")
- man := Man{}
- fmt.Println(reflect.TypeOf(man)) // 返回该结构体定义的名字
- fmt.Println(reflect.ValueOf(man)) // 返回{}
- fmt.Println("")
-
- // 根据类型新建一个Woman对象
- womanTy := reflect.TypeOf(Woman{}) // 这里是根据一个空的Woman对象,得到其类型
- newWomanInterface := reflect.New(womanTy).Interface()
- newWoman := newWomanInterface.(*Woman)
- fmt.Printf("根据reflect.Type新建的newWoman对象内容:%v", newWoman)
- fmt.Println("")
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。