最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
golang标准库reflect包实现操作任意类型对象
时间:2022-06-25 04:44:26 编辑:袖梨 来源:一聚教程网
空接口interface{},reflect配合空接口,让原本是静态类型的go具备了很多动态类型语言的特征。
func TypeOf(i interface{}) Type
TypeOf返回接口中保存的值的类型,TypeOf(nil)会返回nil。
func ValueOf(i interface{}) Value
ValueOf返回一个初始化为i接口保管的具体值的Value,ValueOf(nil)返回Value零值。
func (v Value) NumField() int
返回v持有的结构体类型值的字段数,如果v的Kind不是Struct会panic
利用reflect反射出所有struct字段和方法:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string
Age int
Id string
}
func (u User)sayHello() {
fmt.Println("hello!")
}
func main() {
u := User{Name:"mckee", Age:20, Id:"user100"};
t := reflect.TypeOf(u)
fmt.Println(t) //main.User
fmt.Println(t.Name()) //User
fmt.Println(t.NumField()) //3
fmt.Println(t.Kind()) //struct
//检测类型
if k := t.Kind(); k != reflect.Struct {
return
}
//输出所有的属性,结果如下:
/*
Name string mckee
Age int 20
Id string user100
*/
v := reflect.ValueOf(u)
for i := 0; i < t.NumField(); i++ {
fieldType := t.Field(i)
fmt.Println(fieldType.Name, fieldType.Type, v.Field(i).Interface())
}
//输出所有方法
for i := 0; i < t.NumMethod(); i++ {
m := t.Method(i)
fmt.Println(m.Name, m.Type) //sayHello func(main.User)
}
}
利用reflect动态调用方法:
package main
import (
"fmt"
"reflect"
)
type User struct {
Name string
Age int
Id string
}
func (u User)SayHello(name string) {
fmt.Println("hello, ", name, "! my name is ", u.Name)
}
func main() {
u := User{Name:"mckee", Age:20, Id:"user100"};
//hello, Jack ! my name is mckee
reflect.ValueOf(u).MethodByName("SayHello").Call([]reflect.Value{reflect.ValueOf("Jack")})
}
相关文章
- BDB Coin(BDB币)挖矿的原理 07-02
- Botanix L2主网上线,将比特币区块时间缩短至5秒 07-02
- 原神实用道具有哪些-原神实用道具怎么用 07-02
- 原神元素反应是怎样产生的-原神元素反应攻略 07-02
- 原神幽境危战怎么开启-原神幽境危战攻略 07-02
- 剑星废土10号箱子怎么开启-剑星废土10号箱子开启方法 07-02