中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中的反射是什么

發布時間:2021-08-27 16:52:53 來源:億速云 閱讀:116 作者:chen 欄目:編程語言

本篇內容介紹了“Go語言中的反射是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

什么是反射

反射,嗯...,就是反著的意思唄,就是把東西反過來。

比如這樣的一個很簡單的代碼。

var a int = 3 fmt.Println(a)

我們當然知道a變量是int類型,但是反過來想,程序是怎么知道a是int類型呢???

這時候,就需要用到反射了。

示例代碼

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

兩次代碼綜合一塊執行結果

Go語言中的反射是什么

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

什么???你為我有什么用???,嗯。。。實話實說,用的不是太多,但是必須要會的。

反射(reflect包)

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

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

并且Go的提供了

  • reflect.TypeOf獲取具體類型。

  • reflect.ValueOf獲取具體值。

TypeOf

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

有一個這樣的需求,定義一個函數,可以接收任意類型數據,通過反射打印變量類型。

示例代碼

函數

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) }

執行結果

Go語言中的反射是什么

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

TypeOf 的Name和Kind

這個是啥意思呢??這個在結構體中比較好體現。

簡答來說就是TypeOf返回的太籠統了,還有更加細化的類型,通過這倆屬性獲取。

示例代碼

函數

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

結構體

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) }

執行結果

Go語言中的反射是什么

總結

經過對比,會發現幾個特殊問題。

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

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

如果變量是結構體,Name是結構體名,Kind是struct。

ValueOf

TypeOf只能反過來獲取變量的具體類型,但是并不能獲取具體值,這就有點不太厚道了。

所以ValueOf就來解決這個問題了,但是ValueOf牛叉的是,它里面還包括了變量類型。

注:ValueOf和TypeOf的Kind屬性返回內容是一摸一樣的。

需求:定義一個函數,可以接收任意類型,通過反射得出變量類型和變量值。

函數

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 :可以繼續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) }

執行結果

Go語言中的反射是什么

通過反射設置值

反射還有一個用途,就是動態的修改變量值,可能你暫時體會不到,但是語法還是要學的。

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

示例代碼

函數

func reflectSetValue(x interface{}) {   v := reflect.ValueOf(x)   //kind也必須是Elem調用   var k = v.Elem().Kind()   switch k {   case reflect.Int:     //反射修改必須通過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) }

執行結果

Go語言中的反射是什么

“Go語言中的反射是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

衢州市| 古丈县| 垣曲县| 佛冈县| 福安市| 太谷县| 贵州省| 上高县| 张北县| 西峡县| 镇康县| 呼和浩特市| 威远县| 耿马| 肇州县| 册亨县| 三江| 北票市| 孝义市| 柳河县| 安达市| 右玉县| 凤山市| 宾阳县| 临沧市| 淳安县| 阿拉善右旗| 苍南县| 镇宁| 宣恩县| 无为县| 班玛县| 烟台市| 喀喇沁旗| 同仁县| 吉首市| 沙湾县| 太康县| 定西市| 明水县| 吉安市|