小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

go語言reflect理解

 飲茶仙人 2018-03-24

不少文章在講解GoLang的反射機(jī)制的時候都講的比較復(fù)雜,這里簡單總結(jié)下,做一個淺顯的入門教程:

1、TypeOf方法跟ValueOf方法

TypeOf用來返回變量的類型,ValueOf用來返回變量的方法。

我們在初始化一個結(jié)構(gòu)體的時候,有兩種方式,var a Struct跟a :=new(Struct),其中,前者的類型是struct,后者的類型是指針。

package main

import (
	"fmt"
	"reflect"
)

type MyStruct struct {
	name string
}

func (this *MyStruct) GetName() string {
	return this.name
}

func main() {
	a := new(MyStruct)
	a.name = "yejianfeng"
	typ := reflect.TypeOf(a)
	fmt.Println(typ)
	fmt.Println("-------------------")
	var b MyStruct
	b.name = "abc"
	fmt.Println(reflect.TypeOf(b))
}

輸出如下:

*main.MyStruct

-------------------

main.MyStruct

2、reflect.ValueOf(a).FieldByName方法

如果a是結(jié)構(gòu)體,reflect.ValueOf(a).FieldByName("name")等價于a.name。

如果是指針的話ValueOf返回的是指針的Type,它是沒有Field的,所以也就不能使用FieldByName

3、CanSet方法

CanSet當(dāng)Value是可尋址的時候,返回true,否則返回false。

當(dāng)前面的CanSet是一個指針的時候(p)它是不可尋址的,但是當(dāng)是p.Elem()(實際上就是*p),它就是可以尋址的

package main

import (
	"fmt"
	"reflect"
)

type MyStruct struct {
	name string
}

func (this *MyStruct) GetName() string {
	return this.name
}

func main() {
	var a MyStruct
	a.name = "xiangli"
	fmt.Println(reflect.ValueOf(a).FieldByName("name").CanSet()) //false
	fmt.Println(reflect.ValueOf(&(a.name)).Elem().CanSet())      //true

	fmt.Println("--------------")
	var c string = "yejianfeng"
	p := reflect.ValueOf(&c)
	fmt.Println(p.CanSet())        //false
	fmt.Println(p.Elem().CanSet()) //true
	p.Elem().SetString("newName")
	fmt.Println(c)
}

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多