美文网首页
golang 反射机制

golang 反射机制

作者: 挪威的深林 | 来源:发表于2017-09-12 15:16 被阅读0次

    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}

    相关文章

      网友评论

          本文标题:golang 反射机制

          本文链接:https://www.haomeiwen.com/subject/vvmcsxtx.html