go语言也有反射机制,今天自学到go的反射,发现还是很值得记录一些这个知识点的。go语言它是通过 reflect 包的两个接口方法完成的,分别是:
reflect.TypeOf(i interface{}) 和 reflect.ValueOf(i interface{}) ,这时候我们发现 参数是空的接口,也就是说可以接收任何参数,因为所有变量都是默认实现了interface{},这有点类似java所有的类的父类都是Object。在获取当前参数某一类型时候分为type 和 value。type就是在静态声明时候的类型,value就是在代码付的值。go 反射很强大,每个type或者value下面还有个kind,这个kind表示的是运行时当前参数或者对象状态的底层真正的数据类型。举个例子:type X int var count X reflect.TypeOf(count) 得到的就是 main.X 。 reflect.TypeOf(count).kind 得到的就是int。reflect.ValueOf(count) 得到的是 0。 reflect.ValueOf(count).kind 得到的就是 int。 kind函数就是表示type 或者 value 底层运行时具体的数据类型是什么!!!下面是我做练习的例子:
package main
import (
"reflect"
"fmt"
)
type People struct {
name string
age int
height int
}
type Student struct {
people People
}
var people People = People{"Julian", 26, 175}
var mStudent Student = Student{people}
type LoadingView interface {
loadSucceed()
loadFailure()
}
func (people People) loadSucceed() {
}
func (people People) loadFailure() {
}
func testLoad(load LoadingView) {
loadType := reflect.TypeOf(load)
fmt.Print("load的type是:--", loadType)
fmt.Print("\n")
loadTypeKind := loadType.Kind()
fmt.Print("loadType的Kind是:--", loadTypeKind)
fmt.Print("\n")
loadValue := reflect.ValueOf(load)
fmt.Print("load的value是:--", loadValue)
fmt.Print("\n")
loadValueKind := loadValue.Kind()
fmt.Print("load的value的Kind是:--", loadValueKind)
fmt.Print("\n")
switch value := load.(type) {
case People:
fmt.Print(value)
}
}
func main() {
peopleType := reflect.TypeOf(mStudent)
fmt.Print("people的type是:--", peopleType)
fmt.Print("\n")
peopleTypeKind := peopleType.Kind()
fmt.Print("peopleType的Kind是:--", peopleTypeKind)
fmt.Print("\n")
peopleValue := reflect.ValueOf(mStudent)
fmt.Print("people的value是:--", peopleValue)
fmt.Print("\n")
peopleValueKind := peopleValue.Kind()
fmt.Print("people的value的Kind是:--", peopleValueKind)
fmt.Print("\n")
testLoad(people)
}
下面是打印结果:
people的type是:--main.People
peopleType的Kind是:--struct
people的value是:--{Julian 26 175}
people的value的Kind是:--struct
load的type是:--main.People
loadType的Kind是:--struct
load的value是:--{Julian 26 175}
load的value的Kind是:--struct
{Julian 26 175}
有疑问加站长微信联系(非本文作者)