空接口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")})
}
敢达决战官方正版 安卓版v6.7.9
下载敢达决战 安卓版v6.7.9
下载像素火影骨架佐助 (Perseverance Fire Shadow)手机版v1.16
下载要塞英雄 安卓版v33.20.0-39082670-Android
下载梦想城镇vivo最新版本 安卓版v12.0.1
梦想城镇vivo版是这款卡通风模拟经营类手游的渠道服版本,玩
怦然心动的瞬间 安卓版v1.0
怦然心动的瞬间是一款真人向的恋爱互动游戏,在游戏中玩家将扮演
曼尼汉堡店游戏 安卓版v1.0.3
曼尼汉堡店是一款非常好玩的精品恐怖类型冒险游戏,在这款游戏中
现代总统模拟器去广告版 安卓版v1.0.46
现代总统模拟器是一款休闲养成类游戏,可能对于不少的玩家来说都
现代总统模拟器付费完整版 安卓版v1.0.46
现代总统模拟器高级版在商店是需要付费的,相对于普通版本,高级