欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go REFLECT Library反射類型詳解

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

一、反射概述

反射是指程序在運(yùn)行期間對(duì)程序本身進(jìn)行訪問(wèn)和修改的能力。程序在編譯過(guò)程中變量會(huì)被轉(zhuǎn)換為內(nèi)存地址,變量名不會(huì)被編譯器寫(xiě)入到可執(zhí)行部分。在程序運(yùn)行時(shí)程序無(wú)法獲取自身的信息。

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

對(duì)于動(dòng)態(tài)語(yǔ)言來(lái)說(shuō)如 Ruby 的動(dòng)態(tài)特性相比靜態(tài)語(yǔ)言來(lái)說(shuō)可以非常簡(jiǎn)單的在程序運(yùn)行時(shí)訪問(wèn)變量、方法或者對(duì)象信息,也可以修改它們,甚至可以動(dòng)態(tài)性可以讓程序自己構(gòu)造并執(zhí)行代碼,這就是元編程。

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

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

因此 Ruby 這里動(dòng)態(tài)解釋型語(yǔ)言是反射系統(tǒng)的,但是 Go 作為一門靜態(tài)編譯型語(yǔ)言提供了 relect 標(biāo)準(zhǔn)庫(kù)訪問(wèn)程序的反射信息。

Go 語(yǔ)言的反射系統(tǒng)無(wú)法獲取到一個(gè)可執(zhí)行文件空間中或者是一個(gè)包中所有類型信息,需要配合使用標(biāo)準(zhǔn)庫(kù)中對(duì)應(yīng)的詞法和語(yǔ)法解析器和抽象語(yǔ)法書(shū)對(duì)源碼進(jìn)行掃描后獲取這些信息

二、反射類型對(duì)象

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

在 Go 中使用 reflect 標(biāo)準(zhǔn)庫(kù)下的 typeOf 函數(shù)可以獲取任意變量的反射類型對(duì)象,程序通過(guò) 反射類型對(duì)象 可以訪問(wèn)任意變量的類型信息。

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

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

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

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

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

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

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

并在通過(guò) String() 方法做了小寫(xiě)的轉(zhuǎn)換,最終返回 Kind 為 string

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

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

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í)行上述代碼,輸出結(jié)果如下:

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

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

結(jié)構(gòu)體的 反射類型對(duì)象

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í)行上述代碼,輸出結(jié)果如下:

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

結(jié)構(gòu)體變量的 反射類型對(duì)象 的 Name 就是結(jié)構(gòu)體的名字,種類為 struct 結(jié)構(gòu)體

指針的 反射類型對(duì)象

func main(){
   zulu := Zulu{"stark", 33}
   // 定義一個(gè)指針
   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í)行上述代碼,輸出結(jié)果如下:

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

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

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

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

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

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

也就是說(shuō)我們通過(guò)一個(gè)結(jié)構(gòu)體指針獲取了一個(gè)反射類型,在通過(guò)反射類型獲取到原結(jié)構(gòu)體

Go 中對(duì)指針獲取 反射類型對(duì)象 之后,可以通過(guò)獲取的 反射類型對(duì)象Elem 方法獲取指針?biāo)鶊?zhí)行的元素的類型,這個(gè)過(guò)程被稱為取元素,就相當(dāng)于對(duì)指針執(zhí)行了 * 操作。

以上就是Go REFLECT Library反射類型詳解的詳細(xì)內(nèi)容,更多關(guān)于Go REFLECT Library反射類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • go語(yǔ)言檢測(cè)文件是否存在的方法

    go語(yǔ)言檢測(cè)文件是否存在的方法

    這篇文章主要介紹了go語(yǔ)言檢測(cè)文件是否存在的方法,實(shí)例分析了Go語(yǔ)言文件操作的相關(guān)技巧,需要的朋友可以參考下
    2015-03-03
  • 深入學(xué)習(xí)Golang并發(fā)編程必備利器之sync.Cond類型

    深入學(xué)習(xí)Golang并發(fā)編程必備利器之sync.Cond類型

    Go?語(yǔ)言的?sync?包提供了一系列同步原語(yǔ),其中?sync.Cond?就是其中之一。本文將深入探討?sync.Cond?的實(shí)現(xiàn)原理和使用方法,幫助大家更好地理解和應(yīng)用?sync.Cond,需要的可以參考一下
    2023-05-05
  • golang的空標(biāo)識(shí)符理解

    golang的空標(biāo)識(shí)符理解

    今天小編就為大家分享一篇關(guān)于golang的空標(biāo)識(shí)符理解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • VS?Code安裝go插件失敗原因分析以及解決方案

    VS?Code安裝go插件失敗原因分析以及解決方案

    vscode安裝go插件時(shí),由于各種原因,在安裝插件時(shí)總是失敗,下面這篇文章主要給大家介紹了關(guān)于VS?Code安裝go插件失敗原因分析以及解決的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Golang中的錯(cuò)誤處理深入分析

    Golang中的錯(cuò)誤處理深入分析

    Go錯(cuò)誤處理類似C語(yǔ)言,沒(méi)有提供任何異常,以及類java語(yǔ)言使用的try/catch異常處理機(jī)制。Go異常處理僅簡(jiǎn)化為預(yù)定義的Error類型,Go沒(méi)有提供異常處理機(jī)制,不能拋出類似許多其他語(yǔ)言的異常。相反,Golang集成了新的錯(cuò)誤處理機(jī)制,如panic和recovery
    2023-01-01
  • go語(yǔ)言的工作空間和GOPATH環(huán)境變量介紹

    go語(yǔ)言的工作空間和GOPATH環(huán)境變量介紹

    這篇文章主要介紹了go語(yǔ)言的工作空間和GOPATH環(huán)境變量介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • 使用golang腳本基于kubeadm創(chuàng)建新的token(問(wèn)題分析)

    使用golang腳本基于kubeadm創(chuàng)建新的token(問(wèn)題分析)

    這篇文章主要介紹了使用golang腳本基于kubeadm創(chuàng)建新的token(問(wèn)題分析),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-10-10
  • 淺談goland導(dǎo)入自定義包時(shí)出錯(cuò)(一招解決問(wèn)題)

    淺談goland導(dǎo)入自定義包時(shí)出錯(cuò)(一招解決問(wèn)題)

    這篇文章主要介紹了淺談goland導(dǎo)入自定義包時(shí)出錯(cuò)(一招解決問(wèn)題),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • golang針對(duì)map的判斷,刪除操作示例

    golang針對(duì)map的判斷,刪除操作示例

    這篇文章主要介紹了golang針對(duì)map的判斷,刪除操作,結(jié)合具體實(shí)例形式分析了Go語(yǔ)言map判斷與刪除相關(guān)操作技巧,需要的朋友可以參考下
    2017-03-03
  • Go語(yǔ)言學(xué)習(xí)筆記之錯(cuò)誤和異常詳解

    Go語(yǔ)言學(xué)習(xí)筆記之錯(cuò)誤和異常詳解

    Go語(yǔ)言采用返回值的形式來(lái)返回錯(cuò)誤,這一機(jī)制既可以讓開(kāi)發(fā)者真正理解錯(cuò)誤處理的含義,也可以大大降低程序的復(fù)雜度,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言學(xué)習(xí)筆記之錯(cuò)誤和異常的相關(guān)資料,需要的朋友可以參考下
    2022-07-07

最新評(píng)論