成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Go語(yǔ)言中的反射是什么

本篇內(nèi)容介紹了“Go語(yǔ)言中的反射是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)公司擁有十載成都網(wǎng)站建設(shè)工作經(jīng)驗(yàn),為各大企業(yè)提供做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)服務(wù),對(duì)于網(wǎng)頁(yè)設(shè)計(jì)、PC網(wǎng)站建設(shè)(電腦版網(wǎng)站建設(shè))、重慶APP軟件開發(fā)、wap網(wǎng)站建設(shè)(手機(jī)版網(wǎng)站建設(shè))、程序開發(fā)、網(wǎng)站優(yōu)化(SEO優(yōu)化)、微網(wǎng)站、主機(jī)域名等,憑借多年來(lái)在互聯(lián)網(wǎng)的打拼,我們?cè)诨ヂ?lián)網(wǎng)網(wǎng)站建設(shè)行業(yè)積累了很多網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、網(wǎng)絡(luò)營(yíng)銷經(jīng)驗(yàn),集策劃、開發(fā)、設(shè)計(jì)、營(yíng)銷、管理等網(wǎng)站化運(yùn)作于一體,具備承接各種規(guī)模類型的網(wǎng)站建設(shè)項(xiàng)目的能力。

什么是反射

反射,嗯...,就是反著的意思唄,就是把東西反過(guò)來(lái)。

比如這樣的一個(gè)很簡(jiǎn)單的代碼。

var a int = 3 fmt.Println(a)

我們當(dāng)然知道a變量是int類型,但是反過(guò)來(lái)想,程序是怎么知道a是int類型呢???

這時(shí)候,就需要用到反射了。

示例代碼

v := reflect.TypeOf(a) fmt.Println(v)

兩次代碼綜合一塊執(zhí)行結(jié)果

Go語(yǔ)言中的反射是什么

第二次的第2行代碼,成功的將變量a還原出了int類型。

什么???你為我有什么用???,嗯。。。實(shí)話實(shí)說(shuō),用的不是太多,但是必須要會(huì)的。

反射(reflect包)

在Go中,任何變量,都有具體類型和具體值,就像var a int = 3,具體類型就是int,具體值就是3。

所以,變量的具體類型歸屬在reflect.Type,變量的具體值歸屬在reflect.Value。

并且Go的提供了

  • reflect.TypeOf獲取具體類型。

  • reflect.ValueOf獲取具體值。

TypeOf

TypeOf方法可以獲取變量的具體類型。

有一個(gè)這樣的需求,定義一個(gè)函數(shù),可以接收任意類型數(shù)據(jù),通過(guò)反射打印變量類型。

示例代碼

函數(shù)

func reflectType(x interface{}) {     v := reflect.TypeOf(x)     fmt.Printf("你傳入的變量類型是:%v\n",v) }

main

func main() {     var a int = 666     var b float64 = 3.14     var c string = "hello world"     var d [3]int = [3]int{1,2,6}     var e []int = []int{1,2,6,88}     var f map[string]interface{} = map[string]interface{}{         "Name":"張三",         "Age":18, }     reflectType(a)     reflectType(b)     reflectType(c)     reflectType(d)     reflectType(e)     reflectType(f) }

執(zhí)行結(jié)果

Go語(yǔ)言中的反射是什么

通過(guò)reflect.TypeOf方法,完美解決上述需求。

TypeOf 的Name和Kind

這個(gè)是啥意思呢??這個(gè)在結(jié)構(gòu)體中比較好體現(xiàn)。

簡(jiǎn)答來(lái)說(shuō)就是TypeOf返回的太籠統(tǒng)了,還有更加細(xì)化的類型,通過(guò)這倆屬性獲取。

示例代碼

函數(shù)

func reflectType(x interface{}) { v := reflect.TypeOf(x) fmt.Printf("你傳入的變量類型是:%v | Name:%v | Kind:%v\n", v, v.Name(), v.Kind()) }

結(jié)構(gòu)體

type Student struct {     Name string     Age int }

main

func main() {     var a int     var b *int     var c []int     var d map[string]interface{}     var e Student     reflectType(a)     reflectType(b)     reflectType(c)     reflectType(d)     reflectType(e) }

執(zhí)行結(jié)果

Go語(yǔ)言中的反射是什么

總結(jié)

經(jīng)過(guò)對(duì)比,會(huì)發(fā)現(xiàn)幾個(gè)特殊問(wèn)題。

如果變量是指針類型,Name為空,Kind是ptr。

如果變量是引用類型(切片和map)類型,Name為空,只有Kind。

如果變量是結(jié)構(gòu)體,Name是結(jié)構(gòu)體名,Kind是struct。

ValueOf

TypeOf只能反過(guò)來(lái)獲取變量的具體類型,但是并不能獲取具體值,這就有點(diǎn)不太厚道了。

所以ValueOf就來(lái)解決這個(gè)問(wèn)題了,但是ValueOf牛叉的是,它里面還包括了變量類型。

注:ValueOf和TypeOf的Kind屬性返回內(nèi)容是一摸一樣的。

需求:定義一個(gè)函數(shù),可以接收任意類型,通過(guò)反射得出變量類型和變量值。

函數(shù)

func reflectType(x interface{}) {     v := reflect.ValueOf(x)     k := v.Kind()     switch k {     case reflect.Int:         fmt.Printf("我是Int類型,我的值是%v\n",v.Int())     case reflect.Slice:         fmt.Printf("我是切片類型,我的值是%v\n",v.Slice(1,2))     case reflect.Map:         fmt.Printf("我是切片類型,我的值是%v\n",v.MapKeys())     //case :可以繼續(xù)case下去   } }

main

func main() {   var a int = 1   var c []int = []int{1, 5, 7, 19}   var d map[string]interface{} = map[string]interface{}{     "Name": "你好",     "Age":  18,   }   var e Student   reflectType(a)    reflectType(c)   reflectType(d)   reflectType(e) }

執(zhí)行結(jié)果

Go語(yǔ)言中的反射是什么

通過(guò)反射設(shè)置值

反射還有一個(gè)用途,就是動(dòng)態(tài)的修改變量值,可能你暫時(shí)體會(huì)不到,但是語(yǔ)法還是要學(xué)的。

通過(guò)反射設(shè)置值,需要用到Elem方法,并且傳入的必須是指針。

示例代碼

函數(shù)

func reflectSetValue(x interface{}) {   v := reflect.ValueOf(x)   //kind也必須是Elem調(diào)用   var k = v.Elem().Kind()   switch k {   case reflect.Int:     //反射修改必須通過(guò)Elem     v.Elem().SetInt(200)   } }

main

func main() {   var a int = 10   fmt.Printf("a的值:%v\n", a)   //反射修改值傳入的必須是地址   reflectSetValue(&a)   fmt.Printf("a的值:%v\n", a) }

執(zhí)行結(jié)果

Go語(yǔ)言中的反射是什么

“Go語(yǔ)言中的反射是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站題目:Go語(yǔ)言中的反射是什么
本文路徑:http://jinyejixie.com/article14/pshhde.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、網(wǎng)站收錄、移動(dòng)網(wǎng)站建設(shè)電子商務(wù)、企業(yè)網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)
巴东县| 凯里市| 朝阳市| 苏州市| 揭东县| 日喀则市| 康平县| 泗水县| 抚宁县| 旅游| 岳普湖县| 婺源县| 句容市| 昂仁县| 嘉荫县| 桂东县| 弥勒县| 左云县| 常宁市| 河西区| 三明市| 鄂州市| 吐鲁番市| 买车| 郸城县| 宣威市| 澄城县| 富蕴县| 岚皋县| 镇康县| 南召县| 广州市| 汤阴县| 响水县| 关岭| 河间市| 永吉县| 根河市| 吉木乃县| 丰台区| 衡东县|