总结:
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("")
}
今天的文章go reflect的用法分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/30510.html