空接口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")})
}
孢子2生物进化中文版(Spores)
孢子2生物进化中文版让我们来做一回疯狂的博士,打造一个属于自
叫我万岁爷九游官方版
叫我万岁爷带你体验当换地点感觉,全新的模拟手游大作让你开始一
梦回凤歌
梦回凤歌手游中你将步入古代的宫廷纷争之中,本想度过美好幸福的
洋果子店rose最新版本
洋果子店最新版是一款十分容易让人垂涎的开店经营类手游。游戏玩
明日大亨最新版
明日大亨手游,一个非常经典有趣的模拟经营类型的商战手游,在游