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

Go語言中反射的正確使用

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

介紹

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

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

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

Go的類型設計上有一些基本原則,理解這些基本原則會有助于你理解反射的本質(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.

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

復制代碼 代碼如下:

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)
    // 要設置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())
    }
}
 
// 輸出結果
// t type:main.T
// t type:*main.T
// 0: A int = 23
// 1: B string = skidoo

總結

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

相關文章

  • 使用Golang搭建web服務的實現(xiàn)步驟

    使用Golang搭建web服務的實現(xiàn)步驟

    本文主要介紹了使用Golang搭建web服務的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-04-04
  • Go語言擴展原語之ErrGroup的用法詳解

    Go語言擴展原語之ErrGroup的用法詳解

    除標準庫中提供的同步原語外,Go語言還在子倉庫sync中提供了4種擴展原語,本文主要為大家介紹的是其中的golang/sync/errgroup.Group,感興趣的小伙伴可以了解一下
    2023-07-07
  • go語言中http超時引發(fā)的事故解決

    go語言中http超時引發(fā)的事故解決

    我們使用的是golang標準庫的http client,對于一些http請求,我們在處理的時候,會考慮加上超時時間,如果超時可能會引起報錯,本文就記一次超時引發(fā)的事故
    2021-06-06
  • 初識Golang?Mutex互斥鎖的使用

    初識Golang?Mutex互斥鎖的使用

    在學習操作系統(tǒng)的時候,我們應該都學習過臨界區(qū)、互斥鎖這些概念,用于在并發(fā)環(huán)境下保證狀態(tài)的正確性。在?Go語言?里面互斥鎖是?sync.Mutex?,我們本篇文章就來學習下為什么要使用互斥鎖、如何使用互斥鎖,以及使用時的常見問題
    2022-10-10
  • 一文帶你深入了解Go語言中切片的奧秘

    一文帶你深入了解Go語言中切片的奧秘

    切片是數(shù)組的一個引用,因此切片是引用類型。但自身是結構體,值拷貝傳遞。本文將通過示例帶大家一起探索一下Go語言中切片的奧秘,感興趣的可以了解一下
    2022-11-11
  • Go語言流程控制語句

    Go語言流程控制語句

    這篇文章介紹了Go語言流程控制語句的用法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • golang動態(tài)庫(so)生成與使用方法教程

    golang動態(tài)庫(so)生成與使用方法教程

    這篇文章主要給大家介紹了關于golang動態(tài)庫(so)生成與使用的相關資料,我們平時使用的動態(tài)庫都是由c/c++開發(fā)最后生成的.so文件,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • Golang兩行代碼實現(xiàn)發(fā)送釘釘機器人消息

    Golang兩行代碼實現(xiàn)發(fā)送釘釘機器人消息

    創(chuàng)建一個釘釘機器人必須使用加簽,本文通過Golang兩行代碼實現(xiàn)發(fā)送釘釘機器人消息,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2021-12-12
  • Go 結構體、數(shù)組、字典和 json 字符串的相互轉換方法

    Go 結構體、數(shù)組、字典和 json 字符串的相互轉換方法

    今天小編就為大家分享一篇Go 結構體、數(shù)組、字典和 json 字符串的相互轉換方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • GoLang中的iface?和?eface?的區(qū)別解析

    GoLang中的iface?和?eface?的區(qū)別解析

    iface 和 eface 都是 Go 中描述接口的底層結構體,區(qū)別在于 iface 描述的接口包含方法,而 eface 則是不包含任何方法的空接口:interface{},這篇文章主要介紹了GoLang之iface?和?eface?的區(qū)別,需要的朋友可以參考下
    2022-09-09

最新評論

庆阳市| 六枝特区| 大理市| 西峡县| 桂平市| 贺兰县| 和平县| 保靖县| 周口市| 盈江县| 沁阳市| 明水县| 澎湖县| 红桥区| 集贤县| 凤城市| 通河县| 台中县| 富蕴县| 浦北县| 辽源市| 滦南县| 彰化市| 深圳市| 逊克县| 澜沧| 嘉禾县| 嵊州市| 棋牌| 江口县| 陆丰市| 布尔津县| 息烽县| 永济市| 青川县| 抚远县| 贡嘎县| 云霄县| 宁南县| 中西区| 常山县|