反射reflection-GOLANG

golang ?-?@amazeUI ?-?2017-11-02 11:18:07

type User struct {

????Name string

????Age ?int

????Id ? int

}

func (u User) GetName(name string) { //將匿名方法綁定到結(jié)構(gòu)體中

????fmt.Println("我的名字叫", u.Name, "傳進(jìn)來(lái)的是", name)

}

func main() {

????a := User{"xiaoming", 5, 6}

????a.GetName("測(cè)試1")

????Setname(&a)

????a.GetName("測(cè)試2")

????fmt.Println(a.Name)

????info(a)

????ra := reflect.ValueOf(a)

????rm := ra.MethodByName("GetName")

????args := []reflect.Value{reflect.ValueOf("測(cè)試三")} //通過(guò)反射調(diào)用該對(duì)象方法

????//這里再次回到切片與數(shù)組丧叽。到底什么是切片绞蹦,什么是數(shù)組

????//再次總結(jié)一下飞傀,剛看了點(diǎn)資料,以下是鏈接

????//https://www.zhihu.com/question/66673454

????//以下是總結(jié)

????//1.數(shù)組要指明長(zhǎng)度Array := [ArrayLength] ElementType,arr :=[4]int,數(shù)組拷貝為值拷貝

????//2.切片不需要指明長(zhǎng)度SliceT := []ElementType,但是他有容量機(jī)制,拷貝為指針拷貝

????arr := [4]int{0, 1, 3, 4}

????arrs := arr[1:2]

????ccc := reflect.TypeOf(arrs).Kind() //通過(guò)反射判斷是一個(gè)數(shù)組還是切片

????fmt.Println(ccc)

????rm.Call(args)

}

func info(o interface{}) { //獲取這個(gè)實(shí)例化了的結(jié)構(gòu)體的所有信息

????ot := reflect.TypeOf(o) ?//通過(guò)反射獲取類型

????ov := reflect.ValueOf(o) //獲取值

????fmt.Println(ot, "\n")

????fmt.Println(ov, "\n")

????fmt.Println(ot.Name(), "\n") ? ? ? ? ? ?//打印這個(gè)實(shí)現(xiàn)了空接口的結(jié)構(gòu)名稱

????for i := 0; i < ot.NumField(); i += 1 { //獲取這個(gè)結(jié)構(gòu)體內(nèi)的值

????????n := ot.Field(i)

????????val := ov.Field(i)

????????fmt.Println(n.Type, ":", n.Name, ",", val)

????}

????for i := 0; i < ot.NumMethod(); i += 1 { //打印這個(gè)結(jié)構(gòu)體的每個(gè)方法

????????f := ot.Method(i)

????????fmt.Printf("%s:%v,%v\n", f.Name, f.Type, f.Index)

????}

}

func Setname(o interface{}) { //通過(guò)反射設(shè)置值

????v := reflect.ValueOf(o)

????fmt.Println(v.Elem()) ? ? ? ? ?//這里打印出來(lái)是這個(gè)結(jié)構(gòu)體

????fmt.Println(v.Elem().CanSet()) //這里返回的是個(gè)布爾

????fmt.Println(v.Kind()) ? ? ? ? ?//這里打印出來(lái)的就是ptr

????fmt.Println(reflect.Ptr) ? ? ? //也是ptr,引出個(gè)問(wèn)題,為什么不用字符串"ptr"?以后再找答案,指針

????fmt.Println(v)

????//Elem返回v持有的接口保管的值的Value封裝,

????//或者v持有的指針指向的值的Value封裝菩佑。如果v的Kind不是Interface或Ptr會(huì)panic;如果v持有的值為nil凝化,會(huì)返回Value零值稍坯。

????//Kind返回v持有的值的分類,如果v是Value零值搓劫,返回值為Invalid

????if v.Kind() == reflect.Ptr && !v.Elem().CanSet() { //如果是指針且不能被修改

????????fmt.Println("xxx") //這個(gè)判斷有問(wèn)題,如果不是指針也會(huì)走else,或者可以修改但不是指針也會(huì)走else

????????return

????} else {

????????v = v.Elem()

????}

????n := v.FieldByName("Name")

????if n.IsValid() && n.Kind() == reflect.String { //如果取到了值并且類型是字符串則修改

????????fmt.Println(n, "\n", n.Kind())

????????n.SetString("lele") //修改名字//通過(guò)反射對(duì)值進(jìn)行修改劣光,肯定可以修改拉,傳進(jìn)來(lái)的是指針

????}

}

下面是執(zhí)行結(jié)果

我的名字叫 xiaoming 傳進(jìn)來(lái)的是 測(cè)試1

{xiaoming 5 6}

true

ptr

ptr

&{xiaoming 5 6}

xiaoming

string

我的名字叫 lele 傳進(jìn)來(lái)的是 測(cè)試2

lele

main.User

{lele 5 6}

User

string : Name , lele

int : Age , 5

int : Id , 6

GetName:func(main.User, string),0

slice

我的名字叫 lele 傳進(jìn)來(lái)的是 測(cè)試三

成功: 進(jìn)程退出代碼 0.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末糟把,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子牲剃,更是在濱河造成了極大的恐慌遣疯,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凿傅,死亡現(xiàn)場(chǎng)離奇詭異缠犀,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)聪舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門辨液,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人箱残,你說(shuō)我怎么就攤上這事滔迈。” “怎么了被辑?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵燎悍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我盼理,道長(zhǎng)谈山,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任宏怔,我火速辦了婚禮奏路,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘臊诊。我一直安慰自己鸽粉,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布妨猩。 她就那樣靜靜地躺著潜叛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上威兜,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天销斟,我揣著相機(jī)與錄音,去河邊找鬼椒舵。 笑死蚂踊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笔宿。 我是一名探鬼主播犁钟,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼泼橘!你這毒婦竟也來(lái)了涝动?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤炬灭,失蹤者是張志新(化名)和其女友劉穎醋粟,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體重归,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡米愿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鼻吮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片育苟。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖椎木,靈堂內(nèi)的尸體忽然破棺而出违柏,到底是詐尸還是另有隱情,我是刑警寧澤香椎,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布勇垛,位于F島的核電站,受9級(jí)特大地震影響士鸥,放射性物質(zhì)發(fā)生泄漏闲孤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一烤礁、第九天 我趴在偏房一處隱蔽的房頂上張望讼积。 院中可真熱鬧,春花似錦脚仔、人聲如沸勤众。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)们颜。三九已至吕朵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間窥突,已是汗流浹背努溃。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留阻问,地道東北人梧税。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像称近,于是被迫代替她去往敵國(guó)和親第队。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容