golang反射機(jī)制

反射

  • 反射就是程序能夠在運(yùn)行時(shí)動(dòng)態(tài)的查看變量自己的所有屬性和方法,能夠調(diào)用他的任意方法和屬性。
  • GO的反射基礎(chǔ)是接口和類型系統(tǒng)。
  • 反射的優(yōu)缺點(diǎn):(優(yōu))簡(jiǎn)化代碼、(缺)性能損失、難懂、脆弱

反射三定律

  1. 反射可以從接口值得到反射對(duì)象;
  2. 反射可以從反射對(duì)象獲取接口值。
  3. 若要修改一個(gè)反射對(duì)象,則其值必須為可以修改。
package main
import (
    "fmt"
    "reflect"
)
type User struct {
    Id int
    Name string
    Age int
}
func (u User) ReflectCallFunc(s string) {
    fmt.Println("test ok ", s)
}
func Do(input interface{}) {
    getType := reflect.TypeOf(input)  //TypeOf獲取變量的類型。如:int、string、struct
    fmt.Println("get Type is:", getType.Name())
    getValue := reflect.ValueOf(input) //ValueOf獲取變量的值,結(jié)構(gòu)體上綁定的函數(shù)屬于<值>
    fmt.Println("get all fields is :", getValue)

    // 獲取方法字段
    // 1. 先獲取interface的reflect.Type,然后通過NumField進(jìn)行遍歷
    // 2. 再通過reflect.Type的Field獲取其Field
    // 3. 最后通過Field的Interface()得到對(duì)應(yīng)的value
    for i:=0; i<getType.NumField(); i++ {
        field := getType.Field(i)
        value := getValue.Field(i)
        fmt.Printf("%s:%v = %v\n", field.Name, field.Type, value)
    }

    // 獲取方法
    // 1. 先獲取interface的reflect.Type,然后通過.NumMethod進(jìn)行遍歷
    for i:=0; i<getType.NumMethod();i++ {
        m := getType.Method(i)
        fmt.Printf("%s:%v\n", m.Name, m.Type)
    }
    // 2. 直接調(diào)用方法[使用reflect.ValueOf()來調(diào)用函數(shù)]
    methodValue := getValue.MethodByName("ReflectCallFunc")
    //args := make([]reflect.Value, 0)
    args := []reflect.Value{reflect.ValueOf("Done")}
    methodValue.Call(args)
}

func main() {
    user := User{1, "Fan", 30}
    Do(user)
}
//get Type is: User
//get all fields is : {1 Fan 30}
//Id:int = 1
//Name:string = Fan
//Age:int = 30
//ReflectCallFunc:func(main.User, string)
//test ok  Done

反射應(yīng)用場(chǎng)景

  • Golang的gRPC也是通過反射實(shí)現(xiàn)的。
  • 控制反轉(zhuǎn),依賴注入
  • GO中的類型斷言:判斷接口型變量運(yùn)行時(shí)的實(shí)際類型
  • GIN參數(shù)校驗(yàn)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容