久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

go語言有反射嗎

go語言有反射。Go語言提供了一種機制在運行時更新和檢查變量的值、調(diào)用變量的方法和變量支持的內(nèi)在操作,但是在編譯時并不知道這些變量的具體類型,這種機制被稱為反射。Go語言中的反射是由reflect包提供支持的,它定義了兩個重要的類型Type和Value任意接口值在反射中都可以理解為由reflect.Type和reflect.Value兩部分組成。

go語言有反射嗎

php入門到就業(yè)線上直播課:進入學習
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API調(diào)試工具:點擊使用

本教程操作環(huán)境:windows7系統(tǒng)、GO 1.18版本、Dell G3電腦。

Go語言提供了一種機制在運行時更新和檢查變量的值、調(diào)用變量的方法和變量支持的內(nèi)在操作,但是在編譯時并不知道這些變量的具體類型,這種機制被稱為反射。反射也可以讓我們將類型本身作為第一類的值類型處理。

go語言中的反射

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

支持反射的語言可以在程序編譯期將變量的反射信息,如字段名稱、類型信息、結構體信息等整合到可執(zhí)行文件中,并給程序提供接口訪問反射信息,這樣就可以在程序運行期獲取類型的反射信息,并且有能力修改它們。

C/C++語言沒有支持反射功能,只能通過 typeid 提供非常弱化的程序運行時類型信息;Java、C# 等語言都支持完整的反射功能;Lua、JavaScript 類動態(tài)語言,由于其本身的語法特性就可以讓代碼在運行期訪問程序自身的值和類型信息,因此不需要反射系統(tǒng)。

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

Go語言提供了 reflect 包來訪問程序的反射信息。

reflect 包

Go語言中的反射是由 reflect 包提供支持的,它定義了兩個重要的類型 Type 和 Value 任意接口值在反射中都可以理解為由 reflect.Type 和 reflect.Value 兩部分組成,并且 reflect 包提供了 reflect.TypeOf 和 reflect.ValueOf 兩個函數(shù)來獲取任意對象的 Value 和 Type。

反射的類型對象(reflect.Type)

在Go語言程序中,使用 reflect.TypeOf() 函數(shù)可以獲得任意值的類型對象(reflect.Type),程序通過類型對象可以訪問任意值的類型信息,下面通過示例來理解獲取類型對象的過程:

package main import (     "fmt"     "reflect" ) func main() {     var a int     typeOfA := reflect.TypeOf(a)     fmt.Println(typeOfA.Name(), typeOfA.Kind()) }
登錄后復制

運行結果如下:

go語言有反射嗎

代碼說明如下:

  • 第 9 行,定義一個 int 類型的變量。

  • 第 10 行,通過 reflect.TypeOf() 取得變量 a 的類型對象 typeOfA,類型為 reflect.Type()。

  • 第 11 行中,通過 typeOfA 類型對象的成員函數(shù),可以分別獲取到 typeOfA 變量的類型名為 int,種類(Kind)為 int。

反射的類型(Type)與種類(Kind)

在使用反射時,需要首先理解類型(Type)和種類(Kind)的區(qū)別。編程中,使用最多的是類型,但在反射中,當需要區(qū)分一個大品種的類型時,就會用到種類(Kind)。例如需要統(tǒng)一判斷類型中的指針時,使用種類(Kind)信息就較為方便。

1) 反射種類(Kind)的定義

Go語言程序中的類型(Type)指的是系統(tǒng)原生數(shù)據(jù)類型,如 int、string、bool、float32 等類型,以及使用 type 關鍵字定義的類型,這些類型的名稱就是其類型本身的名稱。例如使用 type A struct{} 定義結構體時,A 就是 struct{} 的類型。

種類(Kind)指的是對象歸屬的品種,在 reflect 包中有如下定義:

type Kind uint const (     Invalid Kind = iota  // 非法類型     Bool                 // 布爾型     Int                  // 有符號整型     Int8                 // 有符號8位整型     Int16                // 有符號16位整型     Int32                // 有符號32位整型     Int64                // 有符號64位整型     Uint                 // 無符號整型     Uint8                // 無符號8位整型     Uint16               // 無符號16位整型     Uint32               // 無符號32位整型     Uint64               // 無符號64位整型     Uintptr              // 指針     Float32              // 單精度浮點數(shù)     Float64              // 雙精度浮點數(shù)     Complex64            // 64位復數(shù)類型     Complex128           // 128位復數(shù)類型     Array                // 數(shù)組     Chan                 // 通道     Func                 // 函數(shù)     Interface            // 接口     Map                  // 映射     Ptr                  // 指針     Slice                // 切片     String               // 字符串     Struct               // 結構體     UnsafePointer        // 底層指針 )
登錄后復制

Map、Slice、Chan 屬于引用類型,使用起來類似于指針,但是在種類常量定義中仍然屬于獨立的種類,不屬于 Ptr。type A struct{} 定義的結構體屬于 Struct 種類,*A 屬于 Ptr。

2) 從類型對象中獲取類型名稱和種類

Go語言中的類型名稱對應的反射獲取方法是 reflect.Type 中的 Name() 方法,返回表示類型名稱的字符串;類型歸屬的種類(Kind)使用的是 reflect.Type 中的 Kind() 方法,返回 reflect.Kind 類型的常量。

下面的代碼中會對常量和結構體進行類型信息獲取。

package main import (     "fmt"     "reflect" ) // 定義一個Enum類型 type Enum int const (     Zero Enum = 0 ) func main() {     // 聲明一個空結構體     type cat struct {     }     // 獲取結構體實例的反射類型對象     typeOfCat := reflect.TypeOf(cat{})     // 顯示反射類型對象的名稱和種類     fmt.Println(typeOfCat.Name(), typeOfCat.Kind())     // 獲取Zero常量的反射類型對象     typeOfA := reflect.TypeOf(Zero)     // 顯示反射類型對象的名稱和種類     fmt.Println(typeOfA.Name(), typeOfA.Kind()) }
登錄后復制

運行結果如下:

go語言有反射嗎

代碼說明如下:

  • 第 17 行,聲明結構體類型 cat。

  • 第 20 行,將 cat 實例化,并且使用 reflect.TypeOf() 獲取被實例化后的 cat 的反射類型對象。

  • 第 22 行,輸出 cat 的類型名稱和種類,類型名稱就是 cat,而 cat 屬于一種結構體種類,因此種類為 struct。

  • 第 24 行,Zero 是一個 Enum 類型的常量。這個 Enum 類型在第 9 行聲明,第 12 行聲明了常量。如沒有常量也不能創(chuàng)建實例,通過 reflect.TypeOf() 直接獲取反射類型對象。

  • 第 26 行,輸出 Zero 對應的類型對象的類型名和種類。

指針與指針指向的元素

Go語言程序中對指針獲取反射對象時,可以通過 reflect.Elem() 方法獲取這個指針指向的元素類型,這個獲取過程被稱為取元素,等效于對指針類型變量做了一個*操作,代碼如下:

package main import (     "fmt"     "reflect" ) func main() {     // 聲明一個空結構體     type cat struct {     }     // 創(chuàng)建cat的實例     ins := &cat{}     // 獲取結構體實例的反射類型對象     typeOfCat := reflect.TypeOf(ins)     // 顯示反射類型對象的名稱和種類     fmt.Printf("name:'%v' kind:'%v'n", typeOfCat.Name(), typeOfCat.Kind())     // 取類型的元素     typeOfCat = typeOfCat.Elem()     // 顯示反射類型對象的名稱和種類     fmt.Printf("element name: '%v', element kind: '%v'n", typeOfCat.Name(), typeOfCat.Kind()) }
登錄后復制

運行結果如下:

go語言有反射嗎

代碼說明如下:

  • 第 13 行,創(chuàng)建了 cat 結構體的實例,ins 是一個 *cat 類型的指針變量。

  • 第 15 行,對指針變量獲取反射類型信息。

  • 第 17 行,輸出指針變量的類型名稱和種類。Go語言的反射中對所有指針變量的種類都是 Ptr,但需要注意的是,指針變量的類型名稱是空,不是 *cat。

  • 第 19 行,取指針類型的元素類型,也就是 cat 類型。這個操作不可逆,不可以通過一個非指針類型獲取它的指針類型。

  • 第 21 行,輸出指針變量指向元素的類型名稱和種類,得到了 cat 的類型名稱(cat)和種類(struct)。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號
久久精品五月,日韩不卡视频在线观看,国产精品videossex久久发布 ,久久av综合
好看的亚洲午夜视频在线| 国产一区福利| 精品日韩毛片| 九九久久电影| 亚洲欧洲另类| 亚洲免费观看高清完整版在线观| 中文字幕日韩欧美精品高清在线| 免费日韩一区二区| 一区二区三区四区日韩| 日韩免费精品| 亚洲视频二区| 日本成人在线网站| 国产精品magnet| 国产成人免费| www.51av欧美视频| 日韩精品一区二区三区免费观看| 欧美成人高清| 美女91精品| 日本天堂一区| 久久在线91| 久久91导航| 亚洲美洲欧洲综合国产一区 | zzzwww在线看片免费| 久久久久网站| 欧美大黑bbbbbbbbb在线| 99pao成人国产永久免费视频 | 亚洲精品一二| 免费一区二区三区在线视频| 天堂8中文在线最新版在线| 91久久黄色| 国产日韩1区| 蜜桃av.网站在线观看| 国产日韩专区| 国产精品对白久久久久粗| 久久影院午夜精品| 亚洲主播在线| 国产精品蜜月aⅴ在线| 欧美男人天堂| 男女男精品网站| 国产精品igao视频网网址不卡日韩| 黑人精品一区| 在线精品福利| 国产一区二区三区亚洲综合| 亚洲女同一区| 欧美国产极品| 模特精品在线| 精品国产乱码久久久久久樱花| 午夜久久久久| 你懂的国产精品| 国产亚洲精品自拍| 精品视频国内| 水蜜桃久久夜色精品一区的特点| 国产欧美日韩免费观看| 久久美女精品| 国产色噜噜噜91在线精品| 蜜桃成人精品| 日韩国产欧美一区二区三区| 欧美黄色网页| 91麻豆精品| 精品一区三区| 精品一区二区三区免费看| 每日更新成人在线视频| 91中文字幕精品永久在线| 亚洲精品护士| 亚洲午夜视频| 麻豆国产精品| 首页国产欧美久久| 日韩.com| 日本天堂一区| 亚洲一区日韩| 日本韩国欧美超级黄在线观看| 欧美精品国产白浆久久久久| 精品一区毛片| 四虎国产精品免费观看| 日本aⅴ免费视频一区二区三区| 欧美综合另类| 国产传媒在线| 久久av资源| 天堂va欧美ⅴa亚洲va一国产| 久久视频国产| 国产一区二区三区国产精品| 日韩和欧美一区二区| 亚洲一区二区三区高清| 国产精品蜜芽在线观看| 国产精品高清一区二区| 在线精品福利| 国产色综合网| 99久久99久久精品国产片果冰| 精品一区二区三区免费看| 欧美日韩在线精品一区二区三区激情综合 | 日韩精品亚洲专区| 午夜在线精品偷拍| 久久久影院免费| 青青青免费在线视频| 欧美国产先锋| 国产欧美日韩一区二区三区四区| 亚洲激情国产| 尤物在线精品| 狠狠操综合网| 亚洲成人国产| 日韩在线观看| 肉色欧美久久久久久久免费看| 精品视频自拍| 欧美激情福利| 欧美日韩午夜| 日韩高清二区| 亚洲18在线| 亚洲日本在线观看视频| 99pao成人国产永久免费视频 | 国产日产精品_国产精品毛片 | 亚洲一区av| 丝袜国产日韩另类美女| 亚洲免费播放| 欧美精品自拍| 99在线观看免费视频精品观看| 国产在线成人| 欧美日韩国产高清电影| 久久美女性网| 九九久久婷婷| 国产精品日本| 日韩精品一级二级| 蜜臀av一区二区三区| 首页亚洲欧美制服丝腿| 国产精品日韩久久久| 国产精品日韩久久久| 夜夜嗨网站十八久久| 久久不射中文字幕| 亚洲一二三区视频| 欧美日韩 国产精品| 国产伦一区二区三区| 国产精品日本一区二区不卡视频| 国产精品亲子伦av一区二区三区| 国产精品久久久久久模特| 国产日韩高清一区二区三区在线 | 里番精品3d一二三区| 国内一区二区三区| av高清不卡| 亚洲精品午夜av福利久久蜜桃| 午夜在线视频观看日韩17c| 男人的天堂久久精品| 欧美一区网站| 精品精品99| 亚洲福利专区| 在线精品一区二区| 国产麻豆一区二区三区精品视频| 美腿丝袜亚洲一区| 日韩av福利| 老牛国产精品一区的观看方式| 亚洲精品成人一区| 欧美啪啪一区| 国产一区二区三区国产精品| 99视频精品视频高清免费| 99视频精品| 日本免费在线视频不卡一不卡二| 国产精品成人国产| 精品欧美一区二区三区在线观看| 蜜桃一区二区三区| 日韩精品成人在线观看| 久久亚洲道色| 亚洲精品一二三区区别| 欧美一区二区三区免费看| 国产91在线精品| 一区在线免费| 国产精品v一区二区三区| 精品国产一区二区三区噜噜噜| 亚洲香蕉网站| 四虎影视精品| 日韩激情综合| 日韩亚洲一区在线| 日韩中文字幕在线一区| sm捆绑调教国产免费网站在线观看| 在线亚洲激情| 国产精品资源| 久久中文字幕av| 日韩中文字幕| 中文字幕一区久| 天堂精品久久久久| 中文在线а√在线8| 亚洲精品美女91| 成人午夜网址| 亚洲涩涩av| 日韩国产欧美| 日韩精品五月天| 久久国产中文字幕| 国产精品一区二区三区四区在线观看| 久久久久免费av| 国产日本亚洲| 婷婷亚洲五月| 免费亚洲婷婷| 综合国产在线| 肉色欧美久久久久久久免费看| 少妇精品久久久一区二区| 成人羞羞视频播放网站| 91麻豆精品激情在线观看最新| 国产精品久久久久av电视剧| 日韩高清一区在线| 久久在线电影| 久久精品国产亚洲一区二区三区| 男人操女人的视频在线观看欧美| 欧美日韩国产观看视频|