go语言的魔幻旅程14-反射

以铜为镜可以正衣冠,以史为镜可以知兴衰

历史的车轮总是滚滚向前,永不停息。公道自在人心,不管谎言如何美丽,最终都会被戳破,总幻想着颐指气使的居高临下的态度来指教他人,首先必须反思下自身到底有没有资格给别人上课,现在的历史不是一百二十年前的历史,幻想着几尊大炮占领一个国家的时代已然成为历史,总抱着一百多年前的旧思维与我们打交道是行不通的,指三说四也是不行的,惹怒了也是不惹的,最终还是会为自己的愚蠢行为付出相应的代价。


反射

1、什么是发射?

反射说的简单点就是程序在运行的过程中,通过某种方式能够获取变量的类型和值,这种方式就称之为反射。而go语言中的反射主要是通过reflect包实现的,其中reflect.TypeOf()和reflect.ValueOf分别返回reflect.Type和reflect.Value。

type order struct {
    ordId      int
    customerId int
}

func createQuery(q interface{}) {
    t := reflect.TypeOf(q)
    v := reflect.ValueOf(q)
    fmt.Println("Type ", t)
    fmt.Println("Value ", v)


}
func main() {
    o := order{
        ordId:      456,
        customerId: 56,
    }
    createQuery(o)

}

2、reflect.Type和reflect.Kind的区别

reflect.Type和reflect.Kind的区别是前者表示实际类型,而后者表示该类型的特定的类别

//举个栗子
type order struct {
    ordId      int
    customerId int
}

func createQuery(q interface{}) {
    t := reflect.TypeOf(q)
    k := t.Kind()
    fmt.Println("Type ", t)
    fmt.Println("Kind ", k)


}
func main() {
    o := order{
        ordId:      456,
        customerId: 56,
    }
    createQuery(o)

}

//输出的结果为
Type  main.order
Kind  struct

3、NumField()和Field()方法

NumField方法返回结构体中字段的数量,而Field(i int)方法返回i的reflect.Value。

//举个栗子
type order struct {
    ordId      int
    customerId int
}

func createQuery(q interface{}) {
    if reflect.ValueOf(q).Kind() == reflect.Struct {
        v := reflect.ValueOf(q)
        fmt.Println("Number of fields", v.NumField())
        for i := 0; i < v.NumField(); i++ {
            fmt.Printf("Field:%d type:%T value:%v\n", i, v.Field(i), v.Field(i))
        }
    }

}
func main() {
    o := order{
        ordId:      456,
        customerId: 56,
    }
    createQuery(o)
}

输出:
Number of fields 2
Field:0 type:reflect.Value value:456
Field:1 type:reflect.Value value:56

4、Int和String方法

Int和String可以帮助我们分别提取reflect.Value作为int64和string.

//举个栗子
func main() {
    a := 56
    x := reflect.ValueOf(a).Int()
    fmt.Printf("type:%T value:%v\n", x, x)
    b := "Naveen"
    y := reflect.ValueOf(b).String()
    fmt.Printf("type:%T value:%v\n", y, y)

}

输出:
type:int64 value:56
type:string value:Naveen


总结

反射这部分的内容知识点讲解的比较少,算是比较容易掌握的知识点,作为一名优秀的编程从业人员必须拿下这部分的内容,目前的教程中没有添加实际的应用场景,可能随着学习的深入后期会补充一些实际的应用场景案例。

上一篇:Day14_76_反射与静态语句块


下一篇:Golang 通过字符串调用方法