中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Go語言中反射的正確使用

發布時間:2020-10-14 23:45:58 來源:腳本之家 閱讀:127 作者:daisy 欄目:編程語言

介紹

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

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

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

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

  1. 變量包括 <type, value> 兩部分。理解這一點你就知道為什么nil != nil了。
  2. type包括 static typeconcrete type. 簡單來說 static type是你在編碼是看見的類型,concrete type是runtime系統看見的類型。
  3. 類型斷言能否成功,取決于變量的concrete type,而不是static type. 因此,一個 reader變量如果它的concrete type也實現了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

總結

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

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

准格尔旗| 若尔盖县| 巴南区| 景谷| 高陵县| 麻城市| 海林市| 共和县| 西平县| 新昌县| 荣昌县| 抚宁县| 广德县| 民勤县| 遵化市| 儋州市| 乐至县| 栾城县| 天津市| 宿州市| 正阳县| 温泉县| 河间市| 六安市| 东城区| 容城县| 杭锦旗| 大厂| 类乌齐县| 阿拉尔市| 柳江县| 梁山县| 吉林市| 仁布县| 孝感市| 报价| 陆丰市| 克什克腾旗| 吴旗县| 灌云县| 清镇市|