日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

golang中的反射

發布時間:2025/6/15 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang中的反射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

變量的內在機制

  • 類型信息,這部分是元信息,是預先定義好的
  • 值類型,這部分是程序運行過程中,動態改變的
  • 反射機制就是在運行時動態的調用對象的方法和屬性,官方自帶的reflect包就是反射相關的,只要包含這個包就可以使用。

    多插一句,Golang的gRPC也是通過反射實現的。

    反射與空接口

    空接口可以存儲任何類型的變量
    那么給你一個空接口,怎么判斷里面存儲的是什么東西?
    在運行時動態的獲取一個變量的類型和值信息就叫反射

    內置包: reflect
    獲取類型信息: reflect.TypeOf
    獲取值信息: reflect.ValueOf

    反射種類(kind)定義

    Go程序中的類型(Type)指的是系統原生數據類型,如int、string、bool、float32等類型,以及使用type關鍵字定義的類型,這些類型的名稱就是其類型本身的名稱。例如使用typeAstruct{}定義結構體時,A就是struct{}的類型。種類(Kind)指的是對象歸屬的品種,在reflect包中有如下定義

    type Kind uintconst (Invalid Kind = iota // 非法類型Bool // 布爾型Int // 有符號整型Int8 // 有符號8位整型Int16 // 有符號16位整型Int32 // 有符號32位整型Int64 // 有符號64位整型Uint // 無符號整型Uint8 // 無符號8位整型Uint16 // 無符號16位整型Uint32 // 無符號32位整型Uint64 // 無符號64位整型Uintptr // 指針Float32 // 單精度浮點數Float64 // 雙精度浮點數Complex64 // 64位復數類型Complex128 // 128位復數類型Array // 數組Chan // 通道Func // 函數Interface // 接口Map // 映射Ptr // 指針Slice // 切片String // 字符串Struct // 結構體UnsafePointer // 底層指針 )

    Map、Slice、Chan屬于引用類型,使用起來類似于指針,但是在種類常量定義中仍然屬于獨立的種類,不屬于Ptr。type A struct{}定義的結構體屬于Struct種類,*A屬于Ptr

    TypeOf和ValueOf

    func reflect_example(a interface{}) {t := reflect.TypeOf(a)fmt.Printf("type of a is %v\n", t)v := reflect.ValueOf(a)fmt.Printf("value of a is %v\n", v)k := t.Kind()fmt.Println(k)}func main() {var x int64 = 3reflect_example(x) }

    運行時修改值

    func reflect_example(a interface{}) {v := reflect.ValueOf(a)k := v.Kind()switch k {case reflect.Int64:fmt.Printf("a is int64, store value is: %d\n", v.Int())case reflect.Float64:fmt.Printf("a is Float64, store value is: %f\n", v.Float())case reflect.Ptr://指針類型 .Elem()相當于 指針取值v.Elem().SetFloat(22.5)fmt.Println("指針")default:fmt.Println("default")} }func main() {var x float64 = 3.4reflect_example(&x)fmt.Println(x) } var x float64 = 3.4 //這邊要傳地址,不然反射的是副本,下面修改副本的值會報錯 v1 := reflect.ValueOf(&x)//這邊已經是指針,要用Elem,通過Elem()獲取指針指向的變量,從而完成賦值操作 v1.Elem().SetFloat(4.3) fmt.Println(v1.Elem().Float())

    結構體屬性

    type Student struct {Name stringSex intAge int//abc string }func main() {var s Studentv := reflect.ValueOf(s)t := v.Type()kind := t.Kind()fmt.Println(kind) //struct//查看字段數量,包含私有字段fmt.Println(v.NumField())//注意,私有獲取不到,會報錯的for i := 0; i < v.NumField(); i++ {field := v.Field(i)fmt.Printf("名字: %s 類型: %v 值: %v\n", t.Field(i).Name, field.Type(), field.Interface())}//修改結構體內部的值v1 := reflect.ValueOf(&s)//用索引方式v1.Elem().Field(0).SetString("abc")//指定名稱方式v1.Elem().FieldByName("Sex").SetInt(2)v1.Elem().FieldByName("Age").SetInt(12)fmt.Println(s) }

    輸出

    struct 3 名字: Name 類型: string 值: 名字: Sex 類型: int 值: 0 名字: Age 類型: int 值: 0 {abc 2 12}

    結構體方法

    func (s *Student) Test() {fmt.Println("this is test") }func main() {s := Student{23, "skidoo"}v := reflect.ValueOf(&s)t := v.Type()v.Elem().Field(0).SetInt(100)fmt.Println("method num: ", v.NumMethod())for i := 0; i < v.NumMethod(); i++ {f := t.Method(i)fmt.Printf("%d method, name: %v, type: %v\n", i, f.Name, f.Type)} }

    輸出

    method num: 1 0 method, name: Test, type: func(*main.Student)

    調用結構體方法

    type Student struct {A intB string }func (s *Student) Test() {fmt.Println("this is test") }func (s *Student) SetA (a int) {s.A = a }func main() {s := Student{23, "skidoo"}//要引用傳遞,不然修改的是副本會報錯v := reflect.ValueOf(&s)m := v.MethodByName("Test")var args1 []reflect.Valuem.Call(args1)setA := v.MethodByName("SetA")var args2 []reflect.Value//參數args2 = append(args2, reflect.ValueOf(100))setA.Call(args2)fmt.Printf("s: %#v\n", s) }

    輸出

    this is test s: main.Student{A:100, B:"skidoo"}

    獲取結構體中的tag信息

    type Student struct {F string `species:"gopher" color:"blue" json:"f"` }func main() {s := Student{}//要引用傳遞,不然修改的是副本會報錯v := reflect.TypeOf(s)field := v.Field(0)fmt.Println(field.Tag.Get("color"), field.Tag.Get("species"), field.Tag.Get("json"))

    復制

    輸出

    blue gopher f

    總結

    以上是生活随笔為你收集整理的golang中的反射的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 视频在线一区二区 | 一本久道久久综合无码中文 | 精品国模一区二区三区 | 制中文字幕音影 | av永久免费在线观看 | 亚洲欧美在线综合 | 偷偷操网站 | 免费成人蒂法网站 | 国产精在线 | 中文字字幕一区二区三区四区五区 | 韩国三级hd两男一女 | 天天操你| 深爱激情综合网 | 特黄三级 | 91人人看| 成人福利在线观看 | 91调教打屁股xxxx网站 | re久久| 日韩欧美一区二 | 成年人激情网 | 极品新婚夜少妇真紧 | 欧美精品久久久久久久久 | 午夜在线观看视频网站 | 日日操日日射 | 久久国产99 | 制中文字幕音影 | 日韩毛片在线看 | 手机看片99 | 精品久久久久久久久久久久久 | 人人妻人人玩人人澡人人爽 | 亚洲国产精品va在线 | 日韩一区二区三区在线观看视频 | 日韩午夜免费视频 | 先锋资源网av | 午夜剧场福利社 | 在线日韩免费 | 日韩成人高清视频在线观看 | 欧美肉大捧一进一出免费视频 | 超碰97人人干 | 嫩草影院久久 | 欧美日韩免费观看视频 | 色网站在线免费观看 | 国产高清免费观看 | 欧美一级做a爰片久久高潮 久热国产精品视频 | 成年人一级黄色片 | 五月激情久久 | 欧美激情国产精品免费 | 色欲人妻综合网 | 久久久精品久久 | 懂色av一区二区 | 欧美日韩中文在线视频 | аⅴ资源新版在线天堂 | 国产网友自拍视频 | 999这里有精品 | 亚洲日日骚 | 久久99网 | 欧美高清精品 | 伊人色影院 | 日韩高清专区 | 国产精品自拍网 | 91色交视频| 久久久久国产精品一区 | 大尺度叫床戏做爰视频 | 日本成人综合 | 久热av在线 | 制服诱惑一区二区三区 | 懂色一区二区三区免费观看 | 国产精品福利影院 | 男女午夜网站 | 在线亚洲网站 | 色网导航站 | 欧美在线免费观看视频 | 国产一线二线三线女 | 国产精品国产三级国产aⅴ9色 | 红桃视频网站 | 网址av | 亚洲精品系列 | 国产精品老女人 | av国产在线观看 | 搡国产老太xxx网站 高h喷汁呻吟3p | 8x8ⅹ国产精品一区二区二区 | 四虎午夜影院 | 国产激情综合五月久久 | 国产a久久| 韩国三级中文字幕 | 蜜桃中文字幕 | 久久久视频在线观看 | 青青操在线 | 在线观看免费高清 | 欧美少妇精品 | www天堂在线 | 最新国产在线视频 | 国产精品久久久久久吹潮 | 国产传媒在线 | 亚洲va天堂va欧美ⅴa在线 | 欧州一区二区三区 | 午夜不卡av | 久久久高潮| 啪啪综合|