1. 程式人生 > 實用技巧 >go 學習之反射

go 學習之反射

TypeOf() 函式用來提取一個介面中值的型別資訊。由於它的輸入引數是一個空的interface{},呼叫此函式時,實參會先被轉化為interface{}型別。這樣,實參的型別資訊、方法集、值資訊都儲存到interface{}變數裡了
ValueOf() 返回值reflect.Value表示interface{}裡儲存的實際變數,它能提供實際變數的各種資訊。相關的方法常常是需要結合型別資訊和值資訊。
注意事項:
reflect.Vlaue.Kind,reflect.Type.Kind,獲取變數的類別,返回的是一個常量
Type 是型別,Kind是類別,Type和Kind可能相同,也可能不同
如: var num int = 10 num的Type是int,Kind也是int
var stu Student stu的Type是pkg1.Student,Kind是struct
通過反射可以讓變數在interface{}和Reflect.Value之間相互轉換
使用反射的方式來獲取變數的值,要求資料型別匹配,比如x是int,那麼就應該使用reflect.Value(x).Int()
package main

import (
        "reflect"
        "fmt"
)

type Student struct {
        name string
        age int
}

func reflectTest(b interface{}) {
        rType := reflect.TypeOf(b)
        rVal := reflect.ValueOf(b)
        iv := rVal.Interface()
        stu := iv.(Student)
        fmt.Printf("type: %T, vtype:%T, name: %v, age:%d\n", rType, rVal, stu.name, stu.age)
}

func main() {
        stu := Student{"caoxt", 30}
        reflectTest(stu)
}