淺談golang reflect反射調用函數

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

Golang也是有反射概念的,其實大多數語言,尤其那種動態語言都有反射的概念和用法。 在python裡getattr,globals()可以通過反射自省的模式來還原對象半身的屬性和方法。

廢話一句,反射是幹嘛的?  通過反射我們可以還原一個對像的屬性,方法。 通俗的講,在分布式環境下,我給你傳了一個json化的資料結構,但是這資料結構被解析後對應了一個方法,這方法可以用來反射調用。 另外golang的rpc也是通過反射實現的。

該文章寫的有些亂,歡迎來噴 ! 另外文章後續不斷更新中,請到原文地址查看更新。http://xiaorui.cc/2016/03/14/%E6%B5%85%E8%B0%88golang-reflect%E5%8F%8D%E5%B0%84%E8%B0%83%E7%94%A8%E5%87%BD%E6%95%B0/

golang實現反射是通過reflect包來實現的, 讓原本是靜態類型的go具備了很多動態類型語言的特徵。   reflect包有兩個資料類型,一個是Type,一個是Value。 

Type就是定義的類型的一個資料類型,Value是值的類型, TypeOf和ValueOf是擷取Type和Value的方法。

具體的Type和Value裡麵包含的方法就要看文檔了:

http://golang.org/pkg/reflect/

下面是一個reflect反射的golang代碼執行個體 .

Python#http://xiaorui.ccpackage mainimport ("fmt""reflect")type Blog struct {Name string}func (this Blog) Test() string {fmt.Println("this is Test method")return this.Name}func main() {var o interface{} = &Blog{"xiaorui.cc"}v := reflect.ValueOf(o)fmt.Println(v)m := v.MethodByName("Test")rets := m.Call([]reflect.Value{})fmt.Println(rets)fmt.Println(rets[0])}
123456789101112131415161718192021222324252627  #http://xiaorui.ccpackage main import ("fmt""reflect") type Blog struct {Name string} func (this Blog) Test() string {fmt.Println("this is Test method")return this.Name} func main() {var o interface{} = &Blog{"xiaorui.cc"}v := reflect.ValueOf(o)fmt.Println(v)m := v.MethodByName("Test")rets := m.Call([]reflect.Value{})fmt.Println(rets)fmt.Println(rets[0])}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.