最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go REFLECT Library反射類型詳解

 更新時間:2022年08月31日 09:54:36   作者:RiemannHypothesis  
這篇文章主要為大家介紹了Go REFLECT Library反射類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

一、反射概述

反射是指程序在運行期間對程序本身進行訪問和修改的能力。程序在編譯過程中變量會被轉換為內存地址,變量名不會被編譯器寫入到可執(zhí)行部分。在程序運行時程序無法獲取自身的信息。

在靜態(tài)語言中如 Java 可以在程序編譯期將變量的反射信息,如字段名稱、類型等信息整合到可執(zhí)行文件中,并給程序提供接口訪問反射信息,這樣就可以在程序運行期獲取類型的反射信息,并修改該它們。

對于動態(tài)語言來說如 Ruby 的動態(tài)特性相比靜態(tài)語言來說可以非常簡單的在程序運行時訪問變量、方法或者對象信息,也可以修改它們,甚至可以動態(tài)性可以讓程序自己構造并執(zhí)行代碼,這就是元編程。

Ruby 中的基類(Object)包含了方法 methods、常量 constants 和實例變量instance_variable 的動態(tài)獲取。

puts String.method_defined?(:upcase) # 判斷是否定義了 upcase 方法
puts String.methods # 獲取所有方法
puts Math.const_get("PI") # 獲取常量
puts Math.const_set("PII", 1000) # 設置常量
puts Math.const_defined?(:P) # 判斷是否包含指定常量
puts Math.constants # 獲取所有常量

因此 Ruby 這里動態(tài)解釋型語言是反射系統(tǒng)的,但是 Go 作為一門靜態(tài)編譯型語言提供了 relect 標準庫訪問程序的反射信息。

Go 語言的反射系統(tǒng)無法獲取到一個可執(zhí)行文件空間中或者是一個包中所有類型信息,需要配合使用標準庫中對應的詞法和語法解析器和抽象語法書對源碼進行掃描后獲取這些信息

二、反射類型對象

基本數(shù)類型的 反射類型對象

在 Go 中使用 reflect 標準庫下的 typeOf 函數(shù)可以獲取任意變量的反射類型對象,程序通過 反射類型對象 可以訪問任意變量的類型信息。

func main(){
   zulu := "stark"
   zuluType := reflect.TypeOf(zulu)
   fmt.Printf("zuluType 的類型為:%v,類型名為:%v,種類為:%v\n", zuluType, zuluType.Name(), zuluType.Kind())
}

執(zhí)行上述代碼,輸出結果如下:

zuluType 的類型為:string,類型名為:string,種類為:string

TypeOf 函數(shù)返回一個 Type 接口,該接口包含非常多的方法

上述代碼中的類型就是變量的數(shù)據類型,如基本數(shù)據類型中的 int、int64、float64、string、map、bool 以及 type 結構體類型等,類型名就是類型本身。

種類既 Kind 方法獲取的信息是指對象歸屬的品種,在 reflect 庫中對對象歸屬的 Kind 做了定義

Kind 的范圍在如下列出的常量中

并在通過 String() 方法做了小寫的轉換,最終返回 Kind 為 string

Name 和 Kind 可以表示一個變量的 反射類型對象 的信息。每種數(shù)據類型變量的 反射類型對象 的 Name 和 Kind 都是不同的。

引用數(shù)據類型的 反射類型對象

func main(){
   zulu := map[string]string{
      "name": "Stark",
      "address": "NYC",
   }
   zuluType := reflect.TypeOf(zulu)
   fmt.Printf("zuluType 的類型為:%v,類型名為:%v,種類為:%v\n", zuluType, zuluType.Name(), zuluType.Kind())
}

執(zhí)行上述代碼,輸出結果如下:

zuluType 的類型為:map[string]string,類型名為:,種類為:map

Map、Array、Slice 和 Pointer 類型的 Name() 都為空字符串

結構體的 反射類型對象

func main(){
   zulu := Zulu{"stark", 33}
   zuluType := reflect.TypeOf(zulu)
   fmt.Printf("zuluType 的類型為:%v,類型名為:%v,種類為:%v\n", zuluType, zuluType.Name(), zuluType.Kind())
}
type Zulu struct {
   Name string
   Age int
}

執(zhí)行上述代碼,輸出結果如下:

zuluType 的類型為:main.Zulu,類型名為:Zulu,種類為:struct

結構體變量的 反射類型對象 的 Name 就是結構體的名字,種類為 struct 結構體

指針的 反射類型對象

func main(){
   zulu := Zulu{"stark", 33}
   // 定義一個指針
   zuluPtr := &zulu
   zuluType := reflect.TypeOf(zuluPtr)
   fmt.Printf("zuluType 的類型為:%v,類型名為:%v,種類為:%v\n", zuluType, zuluType.Name(), zuluType.Kind())
}
type Zulu struct {
   Name string
   Age int
}

執(zhí)行上述代碼,輸出結果如下:

zuluType 的類型為:*main.Zulu,類型名為:,種類為:ptr

指針的 Name() 返回的也是空字符串。

在 main 函數(shù)中增加代碼

// 其余代碼保持不變,在 main 函數(shù)底部增加如下代碼。
// 使用反射類型對象(Type)獲取原類型
zuluTypeElem := zuluType.Elem()
fmt.Printf("zuluTypeElem 的類型為:%v,類型名為:%v,種類為:%v\n", zuluTypeElem, zuluTypeElem.Name(), zuluTypeElem.Kind())

執(zhí)行上述的代碼,輸出結果如下:

zuluType 的類型為:*main.Zulu,類型名為:,種類為:ptr
zuluTypeElem 的類型為:main.Zulu,類型名為:Zulu,種類為:struct

也就是說我們通過一個結構體指針獲取了一個反射類型,在通過反射類型獲取到原結構體

Go 中對指針獲取 反射類型對象 之后,可以通過獲取的 反射類型對象Elem 方法獲取指針所執(zhí)行的元素的類型,這個過程被稱為取元素,就相當于對指針執(zhí)行了 * 操作。

以上就是Go REFLECT Library反射類型詳解的詳細內容,更多關于Go REFLECT Library反射類型的資料請關注腳本之家其它相關文章!

相關文章

  • go判斷文件夾是否存在并創(chuàng)建的實例

    go判斷文件夾是否存在并創(chuàng)建的實例

    這篇文章主要介紹了go判斷文件夾是否存在,并創(chuàng)建的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • go中結構體切片的實現(xiàn)示例

    go中結構體切片的實現(xiàn)示例

    Go語言中的結構體切片是一種結合了結構體和切片特點的數(shù)據結構,用于存儲和操作多個結構體實例,具有一定的參考價值,感興趣的可以了解一下
    2024-11-11
  • Golang中重復錯誤處理的優(yōu)化方法

    Golang中重復錯誤處理的優(yōu)化方法

    這篇文章主要給大家介紹了關于Golang中重復錯誤處理優(yōu)化的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用Golang具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-04-04
  • Golang編寫自定義IP限流中間件的方法詳解

    Golang編寫自定義IP限流中間件的方法詳解

    這篇文章給大家詳細的介紹了Golang編寫自定義IP限流中間件的方法,文章通過代碼實例介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2023-09-09
  • Go基礎教程系列之WaitGroup用法實例詳解

    Go基礎教程系列之WaitGroup用法實例詳解

    這篇文章主要介紹了Go基礎教程系列之WaitGroup用法實例詳解,需要的朋友可以參考下
    2022-04-04
  • 淺析Go語言的數(shù)據類型及數(shù)組

    淺析Go語言的數(shù)據類型及數(shù)組

    Golang是一種靜態(tài)強類型、編譯型語言。Go?語言語法與?C?相近,但功能上有:內存安全,GC(垃圾回收),結構形態(tài)及?CSP-style?并發(fā)計算。本文主要和大家聊聊Go語言的數(shù)據類型及數(shù)組,希望對大家有所幫助
    2022-11-11
  • go 判斷兩個 slice/struct/map 是否相等的實例

    go 判斷兩個 slice/struct/map 是否相等的實例

    這篇文章主要介紹了go 判斷兩個 slice/struct/map 是否相等的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Go語言單元測試的實現(xiàn)及用例

    Go語言單元測試的實現(xiàn)及用例

    在日常開發(fā)中,我們通常需要針對現(xiàn)有的功能進行單元測試,以驗證開發(fā)的正確性,本文主要介紹了Go語言單元測試的實現(xiàn)及用例,具有一定的參考價值,感興趣的可以了解一下
    2024-01-01
  • Golang實現(xiàn)Dijkstra算法過程詳解

    Golang實現(xiàn)Dijkstra算法過程詳解

    Dijkstra 算法是一種用于計算無向圖的最短路徑的算法,它是基于貪心策略的,每次選擇當前距離起始節(jié)點最近的未訪問節(jié)點進行訪問,并更新其相鄰節(jié)點的距離值,以得到最短路徑,這篇文章主要介紹了Golang實現(xiàn)Dijkstra算法,需要的朋友可以參考下
    2023-05-05
  • Go語言之init函數(shù)

    Go語言之init函數(shù)

    Go語言有一個特殊的函數(shù)init,先于main函數(shù)執(zhí)行,實現(xiàn)包級別的一些初始化操作。這篇文章介紹了Go中的Init函數(shù),對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07

最新評論

汶上县| 分宜县| 肥西县| 宕昌县| 兴宁市| 南华县| 顺平县| 柳河县| 长岛县| 正宁县| 普宁市| 连江县| 广饶县| 山东省| 云浮市| 汤原县| 安义县| 惠州市| 邵阳市| 元氏县| 临朐县| 阜宁县| 萨迦县| 铜川市| 璧山县| 水富县| 浦城县| 巴林左旗| 大洼县| 兴化市| 肃南| 康平县| 昌江| 高清| 阳西县| 彝良县| 恩施市| 凤山市| 德化县| 巴彦淖尔市| 蒙山县|