亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Golang > 正文

詳解Golang利用反射reflect動態調用方法

2020-04-01 18:50:52
字體:
來源:轉載
供稿:網友

編程語言中反射的概念

在計算機科學領域,反射是指一類應用,它們能夠自描述和自控制。也就是說,這類應用通過采用某種機制來實現對自己行為的描述(self-representation)和監測(examination),并能根據自身行為的狀態和結果,調整或修改應用所描述行為的狀態和相關的語義。

每種語言的反射模型都不同,并且有些語言根本不支持反射。Golang語言實現了反射,反射機制就是在運行時動態的調用對象的方法和屬性,官方自帶的reflect包就是反射相關的,只要包含這個包就可以使用。

多插一句,Golang的gRPC也是通過反射實現的。

Golang的官方包 reflect 實現了運行時反射(run-time reflection)。運用得當,可謂威力無窮。今天,我們就來利用reflect進行方法的動態調用……

基本知識

首先,反射主要與 golang 的 interface 類型相關。一個 interface 類型的變量包含了兩個指針:一個指向變量的類型,另一個指向變量的值。最常用的莫過于這兩個函數:

func main(){ s := "hello world" fmt.Println(reflect.ValueOf(s))  // hello world fmt.Println(reflect.TypeOf(s))  // string}

其中,

  • reflect.ValueOf() 返回值類型:reflect.Value
  • reflect.TypeOf() 返回值類型:reflect.Type

創建變量

接下來,我們可以使用 reflect  來動態的創建變量:

func main(){ var s string t := reflect.TypeOf(s) fmt.Println(t)         // string sptr := reflect.New(t) fmt.Printf("%s/n", sptr)    // %!s(*string=0xc00000e1e0)}

需要留意, reflect.New() 返回的是一個 指針 :

New returns a Value representing a pointer to a new zero value for the specified type. That is, the returned Value's Type is PtrTo(typ).

這時候,我們可以使用 reflect.Value.Elem() 來取得其實際的值:

sval := sptr.Elem()  // 返回值類型:reflect.Value

然后再將其轉為 interface 并做 type-assertion :

ss := sval.interface().(string)fmt.Println(ss)    // 空字符串

動態調用

假設我們已經定義了以下的 struct 并實現了相關的方法:

type M struct{}type In struct{}type Out struct{} func (m *M) Example(in In) Out { return Out{}}

然后我們就可以通過下面這種方式來進行調用了:

func main() { v := reflect.ValueOf(&M{}) m := v.MethodByName("Example") in := m.Type().In(0) out := m.Type().Out(0) fmt.Println(in, out)     inVal := reflect.New(in).Elem()    // 可以將 inVal 轉為interface后進行賦值之類的操作…… rtn := m.Call([]reflect.Value{inVal}) fmt.Println(rtn[0])}

注冊方法

我們再定義一個保存 M 所有方法的 map struct :

type Handler struct { Func  reflect.Value In   reflect.Type NumIn int Out  reflect.Type NumOut int}

然后我們就可以來遍歷結構體 M 的所有方法了:

func main() { handlers := make(map[string]*Handler) v := reflect.ValueOf(&M{}) t := reflect.TypeOf(&M{}) for i := 0; i < v.NumMethod(); i++ { name := t.Method(i).Name // 可以根據 i 來獲取實例的方法,也可以用 v.MethodByName(name) 獲取  m := v.Method(i) // 這個例子我們只獲取第一個輸入參數和第一個返回參數 in := m.Type().In(0) out := m.Type().Out(0) handlers[name] = &Handler{  Func:  m,  In:   in,  NumIn: m.Type().NumIn(),  Out:  out,  NumOut: m.Type().NumOut(), } }}

Elem()

在學習 reflect 的過程中,我們發現 reflect.Value 和 reflect.Type 都提供了 Elem() 方法。

reflect.Value.Elem() 的作用已經在前面稍微提到了,主要就是返回一個 interface 或者 pointer 的值:

Elem returns the value that the interface v contains or that the pointer v points to. It panics if v's Kind is not Interface or Ptr. It returns the zero Value if v is nil.

reflect.Type.Elem() 的作用則是返回一個類型(如:Array,Map,Chan等)的元素的類型:

Elem returns a type's element type. It panics if the type's Kind is not Array, Chan, Map, Ptr, or Slice.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
8090理伦午夜在线电影| 伊人久久大香线蕉av一区二区| 亚洲欧美国产制服动漫| 久久九九精品99国产精品| 欧美激情亚洲一区| 国产成人av在线| 成人黄色av免费在线观看| 7m第一福利500精品视频| 草民午夜欧美限制a级福利片| 日韩在线观看免费全| 91亚洲国产成人精品性色| 欧美日韩国产91| 91豆花精品一区| 欧美激情亚洲精品| 97精品久久久| 欧美精品免费在线| 伊人久久久久久久久久久久久| 日韩电影免费观看在线| 欧美激情免费在线| 亚洲欧美日韩天堂一区二区| 成人妇女淫片aaaa视频| 岛国av一区二区在线在线观看| 精品性高朝久久久久久久| 国产亚洲欧美视频| 久久亚洲国产精品成人av秋霞| 亚洲乱亚洲乱妇无码| 久久久久久av| 国语自产精品视频在免费| 亚洲精品欧美一区二区三区| 精品国产一区av| 欧美一区二区大胆人体摄影专业网站| 国产精品吹潮在线观看| 精品国产拍在线观看| 不卡中文字幕av| 国产精品日韩在线观看| 影音先锋日韩有码| 亚洲国产欧美精品| 成人黄色生活片| 亚洲电影免费观看高清完整版在线观看| 成人精品视频在线| 国产精品久久久久久搜索| 自拍视频国产精品| 亚洲视频免费一区| 亚洲第一天堂av| 91精品国产成人| 欧美视频在线免费| 亚洲人成在线观看网站高清| 欧美大片免费看| 久久久久久亚洲| 最近2019年日本中文免费字幕| 欧美精品久久久久久久免费观看| 中文字幕欧美在线| 成人h片在线播放免费网站| 日韩国产欧美区| 成人日韩在线电影| 日韩美女视频中文字幕| 国产精品黄页免费高清在线观看| 91牛牛免费视频| 日韩欧美高清视频| 亚洲综合社区网| 久久91亚洲人成电影网站| 一本大道亚洲视频| 亚洲欧美资源在线| 欧美激情xxxxx| 久久精品国产清自在天天线| 国产精品劲爆视频| 国产日韩在线精品av| 久久久久久国产精品美女| 日本一欧美一欧美一亚洲视频| 国产欧美最新羞羞视频在线观看| 琪琪第一精品导航| 国产美女扒开尿口久久久| 精品国产鲁一鲁一区二区张丽| 国产精品99久久久久久久久| 91亚洲国产成人久久精品网站| 国产在线视频一区| 精品美女永久免费视频| 亚洲午夜女主播在线直播| 亚洲美女喷白浆| 久久精品一偷一偷国产| 91a在线视频| 亚洲欧美日韩精品久久亚洲区| 欧美一区二区大胆人体摄影专业网站| 久久久这里只有精品视频| 国产极品精品在线观看| 日韩精品视频免费在线观看| 精品久久久久久久久久ntr影视| 亚洲天堂一区二区三区| 久久久国产精品一区| 97av视频在线| 在线观看欧美日韩国产| 亚洲自拍偷拍福利| 97视频在线观看成人| 欧美一级成年大片在线观看| 久久国产天堂福利天堂| 美女少妇精品视频| 日韩美女免费视频| 亚洲国产欧美一区二区丝袜黑人| 国产精品视频精品视频| 91亚洲永久免费精品| 在线看福利67194| 日韩电影在线观看中文字幕| 欧美自拍大量在线观看| 精品成人av一区| 久久久久久久久久久国产| 国产一区二中文字幕在线看| 日韩国产精品一区| 国产精品久久色| 欧美裸体xxxx极品少妇| 久久精品99久久香蕉国产色戒| 日本高清+成人网在线观看| 欧美精品999| 中文字幕v亚洲ⅴv天堂| 久久精品99无色码中文字幕| 欧美成人一区二区三区电影| 一本色道久久88综合亚洲精品ⅰ| 国产自产女人91一区在线观看| 免费91在线视频| 国产精品日韩av| 国产精品视频区| 欧美日韩激情网| 亚洲日本中文字幕免费在线不卡| 成人h视频在线观看播放| 91久久精品国产| 欧美性猛交xxx| 精品国产一区二区三区久久| 美女扒开尿口让男人操亚洲视频网站| 精品久久香蕉国产线看观看亚洲| 国产精品三级久久久久久电影| 成人激情免费在线| 欧美乱大交xxxxx另类电影| 欧美丝袜一区二区| 欧美日韩国产区| 亚洲成人黄色在线观看| 91精品国产自产91精品| 欧美日韩午夜视频在线观看| 亚洲女人天堂色在线7777| 亚洲精品第一国产综合精品| 久久久久久久久久久网站| 亚洲大胆美女视频| 欧美日韩在线另类| 亚洲精品久久久久国产| 欧美日韩在线第一页| 国产精品自拍网| 欧美电影免费观看高清| 亚洲xxx视频| 91禁国产网站| 超碰日本道色综合久久综合| 日本不卡视频在线播放| 国产91露脸中文字幕在线| 国产精品女人久久久久久| 久久久久这里只有精品| 欧美性xxxx极品hd满灌| 日韩久久免费视频| 国产成人精品av在线| 欧美精品在线第一页| 久久理论片午夜琪琪电影网| 国产精品久久久久77777| 欧美专区福利在线| 国产亚洲精品久久久久久牛牛| 亚洲欧洲偷拍精品| 91夜夜揉人人捏人人添红杏| 91精品国产乱码久久久久久久久| 亚洲精品久久久久中文字幕欢迎你|