<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
反射是指程式在執行期間對程式本身進行存取和修改的能力。程式在編譯過程中變數會被轉換為記憶體地址,變數名不會被編譯器寫入到可執行部分。在程式執行時程式無法獲取自身的資訊。
在靜態語言中如 Java 可以在程式編譯期將變數的反射資訊,如欄位名稱、型別等資訊整合到可執行檔案中,並給程式提供介面存取反射資訊,這樣就可以在程式執行期獲取型別的反射資訊,並修改該它們。
對於動態語言來說如 Ruby 的動態特性相比靜態語言來說可以非常簡單的在程式執行時存取變數、方法或者物件資訊,也可以修改它們,甚至可以動態性可以讓程式自己構造並執行程式碼,這就是超程式設計。
Ruby 中的基礎類別(Object)包含了方法 methods
、常數 constants
和範例變數instance_variable
的動態獲取。
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 這裡動態直譯語言是反射系統的,但是 Go 作為一門靜態編譯型語言提供了 relect
標準庫存取程式的反射資訊。
Go 語言的反射系統無法獲取到一個可執行檔案空間中或者是一個包中所有型別資訊,需要配合使用標準庫中對應的詞法和語法解析器和抽象語法書對原始碼進行掃描後獲取這些資訊
在 Go 中使用 reflect
標準庫下的 typeOf
函數可以獲取任意變數的反射型別物件
,程式通過 反射型別物件
可以存取任意變數的型別資訊。
func main(){ zulu := "stark" zuluType := reflect.TypeOf(zulu) fmt.Printf("zuluType 的型別為:%v,型別名為:%v,種類為:%vn", zuluType, zuluType.Name(), zuluType.Kind()) }
執行上述程式碼,輸出結果如下:
zuluType 的型別為:string,型別名為:string,種類為:string
TypeOf
函數返回一個 Type 介面,該介面包含非常多的方法
上述程式碼中的型別就是變數的資料型別,如基本資料型別中的 int、int64、float64、string、map、bool 以及 type 結構體型別等,型別名就是型別本身。
種類既 Kind
方法獲取的資訊是指物件歸屬的品種,在 reflect
庫中對物件歸屬的 Kind 做了定義
Kind 的範圍在如下列出的常數中
並在通過 String()
方法做了小寫的轉換,最終返回 Kind 為 string
Name 和 Kind 可以表示一個變數的 反射型別物件
的資訊。每種資料型別變數的 反射型別物件
的 Name 和 Kind 都是不同的。
func main(){ zulu := map[string]string{ "name": "Stark", "address": "NYC", } zuluType := reflect.TypeOf(zulu) fmt.Printf("zuluType 的型別為:%v,型別名為:%v,種類為:%vn", zuluType, zuluType.Name(), zuluType.Kind()) }
執行上述程式碼,輸出結果如下:
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,種類為:%vn", zuluType, zuluType.Name(), zuluType.Kind()) } type Zulu struct { Name string Age int }
執行上述程式碼,輸出結果如下:
zuluType 的型別為:main.Zulu,型別名為:Zulu,種類為:struct
結構體變數的 反射型別物件 的 Name 就是結構體的名字,種類為 struct 結構體
func main(){ zulu := Zulu{"stark", 33} // 定義一個指標 zuluPtr := &zulu zuluType := reflect.TypeOf(zuluPtr) fmt.Printf("zuluType 的型別為:%v,型別名為:%v,種類為:%vn", zuluType, zuluType.Name(), zuluType.Kind()) } type Zulu struct { Name string Age int }
執行上述程式碼,輸出結果如下:
zuluType 的型別為:*main.Zulu,型別名為:,種類為:ptr
指標的 Name() 返回的也是空字串。
在 main 函數中增加程式碼
// 其餘程式碼保持不變,在 main 函數底部增加如下程式碼。 // 使用反射型別物件(Type)獲取原型別 zuluTypeElem := zuluType.Elem() fmt.Printf("zuluTypeElem 的型別為:%v,型別名為:%v,種類為:%vn", zuluTypeElem, zuluTypeElem.Name(), zuluTypeElem.Kind())
執行上述的程式碼,輸出結果如下:
zuluType 的型別為:*main.Zulu,型別名為:,種類為:ptr
zuluTypeElem 的型別為:main.Zulu,型別名為:Zulu,種類為:struct
也就是說我們通過一個結構體指標獲取了一個反射型別,在通過反射型別獲取到原結構體
Go 中對指標獲取 反射型別物件
之後,可以通過獲取的 反射型別物件
的 Elem
方法獲取指標所執行的元素的型別,這個過程被稱為取元素,就相當於對指標執行了 *
操作。
以上就是Go REFLECT Library反射型別詳解的詳細內容,更多關於Go REFLECT Library反射型別的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45