成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一篇文章教會你Go語言基礎之結構體反射

開發 后端
本篇從主要講述Go反射結構體的相關知識:反射在結構體中的應用,如何單獨反射結構體字段信息,ValueOf其他操作,如何放射結構體綁定的方法。

[[358777]]

 前言

Hey,大家好呀,我是碼農,星期八。

反射在結構體中的應用,才是最廣泛的!畢竟在Go中,是用結構體代替對象的!

所以最多的,最麻煩的,也是反射結構體,也是最靈活的!

反射在結構體的應用

上次講的,只是在普通變量中的應用,相對來說,使用的場景不是太多。

但是反射在結構體中的應用,基本會貫穿整個Go語言基礎。

示例代碼

結構體

  1. type Student struct { 
  2.     Name   string   `json:"name" describe:"姓名"
  3.     Age    int      `json:"age" describe:"年齡"
  4.     Gender bool     `json:"gender" describe:"性別"
  5.     Hobby  []string `json:"hobby" describe:"愛好"

main

  1. func main() { 
  2.     //實例化結構體 
  3.     var s1 = Student{ 
  4.         Name:   "張三", 
  5.         Age:    18, 
  6.         Gender: true, 
  7.         Hobby:  []string{"吃", "喝", "pia", "玩"}, 
  8.     var t = reflect.TypeOf(s1) 
  9.     fmt.Println(t.Name())     //Student 
  10.     fmt.Println(t.Kind())     //struct 
  11.     fmt.Println(t.NumField()) //結果:4,表示多少個字段 
  12.     for i := 0; i < t.NumField(); i++ { 
  13.         field := t.Field(i)//每個結構體對象 
  14.         /* 
  15.             {Name  string json:"name" describe:"姓名" 0 [0] false
  16.             {Age  int json:"age" describe:"年齡" 16 [1] false
  17.             {Gender  bool json:"gender" describe:"性別" 24 [2] false
  18.             {Hobby  []string json:"hobby" describe:"愛好" 32 [3] false
  19.         */ 
  20.         //fmt.Println(field) 
  21.         fmt.Println("------"
  22.         fmt.Printf("field.Name:%v\n",field.Name
  23.         fmt.Printf("field.Index:%v\n",field.Index
  24.         fmt.Printf("field.Type:%v\n",field.Type) 
  25.         fmt.Printf("field.Tag:%v\n",field.Tag.Get("describe")) 
  26.  
  27.     } 

執行結果


單獨反射指定字段信息

main代碼

  1. func main() { 
  2.     //實例化結構體 
  3.     var s1 = Student{ 
  4.         Name:   "張三", 
  5.         Age:    18, 
  6.         Gender: true, 
  7.         Hobby:  []string{"吃", "喝", "pia", "玩"}, 
  8.     var t = reflect.TypeOf(s1) 
  9.     genderField, ok := t.FieldByName("Gender"
  10.     if ok { 
  11.         fmt.Println(genderField.Name)                //Gender 
  12.         fmt.Println(genderField.Index)               //[2] 
  13.         fmt.Println(genderField.Type)                //bool 
  14.         fmt.Println(genderField.Tag.Get("describe")) //性別 
  15.     } 

ValueOf

上述的代碼只能用的是TypeOf,只能返回類型等信息,相對來說不是太智能,ValueOf可以獲取值,同樣也能獲取類型,相對來說比TypeOf好一點。

示例代碼

main

  1. func main() { 
  2.     //實例化結構體 
  3.     var s1 = Student{ 
  4.         Name:   "張三", 
  5.         Age:    18, 
  6.         Gender: true, 
  7.         Hobby:  []string{"吃", "喝", "pia", "玩"}, 
  8.     var v = reflect.ValueOf(s1) 
  9.     for i := 0; i < v.NumField(); i++ { 
  10.         field :=v.Field(i) 
  11.         fmt.Println("------"
  12.         fmt.Printf("Kind:%v\n",field.Kind()) 
  13.         fmt.Printf("值:%v\n",field.Interface()) 
  14.     } 

執行結果

 

反射方法

上述我們反射的都是值,有沒有反射是否可以反射函數,并且調用函數呢??

結構體和綁定函數代碼

  1. type Student struct { 
  2.     Name   string   `json:"name" describe:"姓名"
  3.     Age    int      `json:"age" describe:"年齡"
  4.     Gender bool     `json:"gender" describe:"性別"
  5.     Hobby  []string `json:"hobby" describe:"愛好"
  6.  
  7. //無參方法 
  8. func (this Student) Say() { 
  9.     fmt.Printf("我是%v,我的年齡是%v,我的性別是%v,我的愛好是%v\n", this.Name, this.Age, this.Gender, this.Hobby) 
  10. //有參數方法 
  11. func (this Student) Jump(distance int) { 
  12.     fmt.Printf("我是%v,我跳遠跳了%v米\n", this.Name, distance) 

main

  1. func main() { 
  2.     //實例化結構體 
  3.     var s1 = Student{ 
  4.         Name:   "張三", 
  5.         Age:    18, 
  6.         Gender: true, 
  7.         Hobby:  []string{"吃", "喝", "pia", "玩"}, 
  8.     var t = reflect.TypeOf(s1) 
  9.     var v = reflect.ValueOf(s1) 
  10.     fmt.Println(v.NumMethod(),v.NumField()) 
  11.     for i := 0; i < v.NumMethod(); i++ { 
  12.         method := v.Method(i) 
  13.         fmt.Println("--------"
  14.         fmt.Println(method)//0x48c4e0 函數地址 
  15.         fmt.Println(method.Type())//func(int) 函數類型,形參和返回值 
  16.         fmt.Println(t.Method(i).Name)//Jump,函數名,注意,由t來調用的 
  17.     } 

執行結果

 

反射調用函數

  1. func main() { 
  2.     //實例化結構體 
  3.     var s1 = Student{ 
  4.         Name:   "張三", 
  5.         Age:    18, 
  6.         Gender: true, 
  7.         Hobby:  []string{"吃", "喝", "pia", "玩"}, 
  8.     var v = reflect.ValueOf(s1) 
  9.  
  10.     //通過反射調用函數 
  11.     //調用Jump函數 
  12.     //反射調用函數必須傳一個參數,不管有沒有形參都要傳 
  13.     //var args = []reflect.Value{} 
  14.     //v.MethodByName("Say").Call(args) 
  15.  
  16.     //如果需要傳參數 
  17.     //參數需要用reflect.ValueOf(1) 強轉一下 
  18.  
  19.     var args = []reflect.Value{reflect.ValueOf(2)} 
  20.     v.MethodByName("Jump").Call(args) 

注:注意第14行和20行代碼區別,如果要傳參數,參考第20行代碼。

執行結果


反射注意事項

在平常開發中,盡量慎用反射,原因如下。

  • 反射性能可能會比較低,畢竟是反正走的,一般比正向操作慢一兩個級別。
  • 反射越多,代碼越爛,TypeOf和ValueOf都有Kind,很多情況是TypeOf和ValueOf混用的,所以對于基礎不好的,極不友好。
  • 在Go中,是沒有try的,如果反射沒有處理好異常,程序會直接崩潰,可能在意想不到的地方。

總結

上述我們主要講述了Go反射結構體的相關知識,包括有

  • 反射在結構體中的應用
  • 如何單獨反射結構體字段信息
  • ValueOf其他操作
  • 如何放射結構體綁定的方法

到此為止反射就講完了,一定要多嘗試,多敲敲代碼,反射的用法還有很多。

 

責任編輯:姜華 來源: Go語言進階學習
相關推薦

2020-12-16 08:07:28

語言基礎反射

2021-09-15 10:00:33

Go語言Modules

2021-05-29 10:20:54

GoModules語言

2019-10-17 19:15:22

jQueryJavaScript前端

2020-11-05 09:58:16

Go語言Map

2020-12-23 08:39:11

Go語言基礎技術

2022-02-16 10:03:06

對象接口代碼

2020-10-22 08:33:22

Go語言

2020-11-11 10:52:54

Go語言C語言

2023-06-21 00:10:17

JSONWeb服務器JavaScript

2021-02-19 19:35:53

SVG 形狀元素

2020-11-13 08:14:28

JavaScript

2021-10-09 07:10:31

Go語言基礎

2022-04-27 10:01:43

切片Go封裝

2020-10-23 08:38:19

Go語言

2020-10-25 07:33:13

Go語言

2020-12-09 09:59:32

Go語言技術

2021-02-20 10:06:14

語言文件操作

2020-12-30 09:04:32

Go語言TCPUDP

2020-12-27 10:15:44

Go語言channel管道
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人精品视频在线观看 | 亚洲国产精品激情在线观看 | 青青草原精品99久久精品66 | 国产97色 | 国产一区久久 | 精品久久香蕉国产线看观看亚洲 | 国产福利视频导航 | xx视频在线观看 | 成年人视频免费在线观看 | 在线观看免费高清av | 日本电影网站 | 国产一区二区三区在线看 | 久久夜视频| 日本久久一区 | 免费在线观看毛片 | 亚洲一区二区三区在线播放 | 国产精品欧美一区喷水 | 久优草 | 91成人免费观看 | 91精品一区 | 精品一区二区三 | 91精品国产92 | 亚洲网在线 | 久久久久免费 | 国产小视频在线 | 欧美三级在线 | 99久久精品一区二区毛片吞精 | 成人在线免费观看 | 91精品久久久久 | 国产精品免费一区二区 | 国产91网址| 久久影音先锋 | 精品久久亚洲 | 国产精品国产三级国产aⅴ无密码 | 亚洲精久久 | 韩日免费视频 | 国产农村一级片 | 欧美激情国产日韩精品一区18 | 中文字幕一区二区三区不卡 | 久草视频观看 | 精品日韩一区二区 |