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

Go語言中反射的正確使用

 更新時間:2016年12月06日 10:21:03   投稿:daisy  
Go本身不支持模板,因此在以往需要使用模板的場景下往往就需要使用反射(reflect). 反射使用多了以后會容易上癮,有些人甚至?xí)纬梢环N莫名其妙的鄙視鏈。下面這篇文章就給大家介紹了如何正確使用Go語言中的反射以及在使用前的注意,有需要的朋友們下面來一起看看吧。

介紹

反射是元數(shù)據(jù)編程的一種形式,指的是程序獲得本身結(jié)構(gòu)的一種能力。不同語言的反射模型實現(xiàn)不一樣,本文中的反射,僅僅指的是Go語言中的反射模型。

反射有兩個問題,在使用前需要三思:

  1. 大量的使用反射會損失一定性能
  2. Clear is better than clever. Reflection is never clear.

Go的類型設(shè)計上有一些基本原則,理解這些基本原則會有助于你理解反射的本質(zhì):

  1. 變量包括 <type, value> 兩部分。理解這一點你就知道為什么nil != nil了。
  2. type包括 static typeconcrete type. 簡單來說 static type是你在編碼是看見的類型,concrete type是runtime系統(tǒng)看見的類型。
  3. 類型斷言能否成功,取決于變量的concrete type,而不是static type. 因此,一個 reader變量如果它的concrete type也實現(xiàn)了write方法的話,它也可以被類型斷言為writer.
  4. Go中的反射依靠interface{}作為橋梁,因此遵循原則3. 例如,反射包.Kind方法返回的是concrete type, 而不是static type.

多說無用,下面來看示例代碼

復(fù)制代碼 代碼如下:

package main
 
import (
    "fmt"
    "reflect"
)
 
type T struct {
    A int
    B string
}
 
func main() {
    t := T{23, "skidoo"}
    tt := reflect.TypeOf(t)
    fmt.Printf("t type:%v\n", tt)
    ttp := reflect.TypeOf(&t)
    fmt.Printf("t type:%v\n", ttp)
    // 要設(shè)置t的值,需要傳入t的地址,而不是t的拷貝。
    // reflect.ValueOf(&t)只是一個地址的值,不是settable, 通過.Elem()解引用獲取t本身的reflect.Value
    s := reflect.ValueOf(&t).Elem()
    typeOfT := s.Type()
    for i := 0; i < s.NumField(); i++ {
        f := s.Field(i)
        fmt.Printf("%d: %s %s = %v\n", i,
            typeOfT.Field(i).Name, f.Type(), f.Interface())
    }
}
 
// 輸出結(jié)果
// t type:main.T
// t type:*main.T
// 0: A int = 23
// 1: B string = skidoo

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • golang?pprof?監(jiān)控系列?go?trace統(tǒng)計原理與使用解析

    golang?pprof?監(jiān)控系列?go?trace統(tǒng)計原理與使用解析

    這篇文章主要為大家介紹了golang?pprof?監(jiān)控系列?go?trace統(tǒng)計原理與使用解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • golang中的nil接收器詳解

    golang中的nil接收器詳解

    這篇文章主要介紹了golang中的nil接收器,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • Go語言之使用pprof工具查找goroutine(協(xié)程)泄漏

    Go語言之使用pprof工具查找goroutine(協(xié)程)泄漏

    這篇文章主要介紹了Go語言之使用pprof工具查找goroutine(協(xié)程)泄漏,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Go語言利用heap實現(xiàn)優(yōu)先級隊列

    Go語言利用heap實現(xiàn)優(yōu)先級隊列

    這篇文章主要為大家詳細(xì)介紹了Go語言中heap的使用以及如何利用heap實現(xiàn)優(yōu)先級隊列的相關(guān)資料,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-05-05
  • 詳解在Go語言單元測試中如何解決文件依賴問題

    詳解在Go語言單元測試中如何解決文件依賴問題

    現(xiàn)如今的?Web?應(yīng)用程序往往采用?RESTful?API?接口形式對外提供服務(wù),后端接口直接向前端返回?HTML?文件的情況越來越少,所以在程序中操作文件的場景也變少了,在編寫單元測試時,文件就成了被測試代碼的外部依賴,本文就來講解下測試過程中如何解決文件外部依賴問題
    2023-08-08
  • golang語言中wasm 環(huán)境搭建的過程詳解

    golang語言中wasm 環(huán)境搭建的過程詳解

    將 golang 打包為 WASM,通常有兩種打包方式,一種是 golang 自帶的,另外是使用 tinygo ,接下來通過本文給大家介紹golang語言中wasm 環(huán)境搭建的過程,感興趣的朋友一起看看吧
    2021-11-11
  • go build -tags構(gòu)建約束試驗示例解析

    go build -tags構(gòu)建約束試驗示例解析

    這篇文章主要為大家介紹了go build -tags構(gòu)建約束試驗示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • golang使用 gomodule 在公共測試環(huán)境管理go的依賴的實例詳解

    golang使用 gomodule 在公共測試環(huán)境管理go的依賴的實例詳解

    這篇文章主要介紹了golang使用 gomodule 在公共測試環(huán)境管理go的依賴,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11
  • 詳解Golang中的通道機(jī)制與應(yīng)用

    詳解Golang中的通道機(jī)制與應(yīng)用

    這篇文章主要來和大家一起深入探討了Go語言中通道(Channel)的各個方面,文章詳細(xì)解析了通道的類型、操作方法以及垃圾回收機(jī)制,有需要的可以了解下
    2023-10-10
  • Go語言異步API設(shè)計的扇入扇出模式詳解

    Go語言異步API設(shè)計的扇入扇出模式詳解

    這篇文章主要為大家介紹了Go語言異步API設(shè)計的扇入扇出模式示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評論