国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Golang > 正文

Go語言中反射的正確使用

2020-04-01 19:07:52
字體:
來源:轉載
供稿:網友

介紹

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

 

總結

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 来安县| 新营市| 冀州市| 织金县| 新野县| 资中县| 略阳县| 普宁市| 阳曲县| 科技| 赤壁市| 长武县| 辽宁省| 泸定县| 福海县| 巢湖市| 临海市| 金门县| 孝昌县| 瑞安市| 梅河口市| 海门市| 台东市| 乳山市| 商南县| 六安市| 贺州市| 观塘区| 滨州市| 张家界市| 确山县| 临泽县| 临沧市| 新田县| 蒙山县| 庆云县| 日喀则市| 光泽县| 石林| 梅河口市| 双江|