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

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

開發 后端
Hey,大家好呀,我是碼農,星期八!,我們以前學的呀,都屬于正向定義變量,正向開發!但是有沒有什么辦法能反著來呢?根據變量獲取類型等操作。

 [[357962]]

前言

Hey,大家好呀,我是碼農,星期八!,我們以前學的呀,都屬于正向定義變量,正向開發!

但是有沒有什么辦法能反著來呢?根據變量獲取類型等操作。

一起來看看Go的反射吧!!!

什么是反射

反射,嗯...,就是反著的意思唄,就是把東西反過來。

比如這樣的一個很簡單的代碼。

  1. var a int = 3 
  2. fmt.Println(a) 

我們當然知道a變量是int類型,但是反過來想,程序是怎么知道a是int類型呢???

這時候,就需要用到反射了。

示例代碼

  1. v := reflect.TypeOf(a) 
  2. fmt.Println(v) 

兩次代碼綜合一塊執行結果

第二次的第2行代碼,成功的將變量a還原出了int類型。

什么???你為我有什么用???,嗯。。。實話實說,用的不是太多,但是必須要會的。

反射(reflect包)

在Go中,任何變量,都有具體類型和具體值,就像var a int = 3,具體類型就是int,具體值就是3。

所以,變量的具體類型歸屬在reflect.Type,變量的具體值歸屬在reflect.Value。

并且Go的提供了

  • reflect.TypeOf獲取具體類型。
  • reflect.ValueOf獲取具體值。

TypeOf

TypeOf方法可以獲取變量的具體類型。

有一個這樣的需求,定義一個函數,可以接收任意類型數據,通過反射打印變量類型。

示例代碼

函數

  1. func reflectType(x interface{}) { 
  2.     v := reflect.TypeOf(x) 
  3.     fmt.Printf("你傳入的變量類型是:%v\n",v) 

main

  1. func main() { 
  2.     var a int = 666 
  3.     var b float64 = 3.14 
  4.     var c string = "hello world" 
  5.     var d [3]int = [3]int{1,2,6} 
  6.     var e []int = []int{1,2,6,88} 
  7.     var f map[string]interface{} = map[string]interface{}{ 
  8.         "Name":"張三", 
  9.         "Age":18, 
  10.     reflectType(a) 
  11.     reflectType(b) 
  12.     reflectType(c) 
  13.     reflectType(d) 
  14.     reflectType(e) 
  15.     reflectType(f) 

執行結果

通過reflect.TypeOf方法,完美解決上述需求。

TypeOf 的Name和Kind

這個是啥意思呢??這個在結構體中比較好體現。

簡答來說就是TypeOf返回的太籠統了,還有更加細化的類型,通過這倆屬性獲取。

示例代碼

函數

  1. func reflectType(x interface{}) { 
  2. v := reflect.TypeOf(x) 
  3. fmt.Printf("你傳入的變量類型是:%v | Name:%v | Kind:%v\n", v, v.Name(), v.Kind()) 

結構體

  1. type Student struct { 
  2.     Name string 
  3.     Age int 

main

  1. func main() { 
  2.     var a int 
  3.     var b *int 
  4.     var c []int 
  5.     var d map[string]interface{} 
  6.     var e Student 
  7.     reflectType(a) 
  8.     reflectType(b) 
  9.     reflectType(c) 
  10.     reflectType(d) 
  11.     reflectType(e) 

執行結果

總結

經過對比,會發現幾個特殊問題。

如果變量是指針類型,Name為空,Kind是ptr。

如果變量是引用類型(切片和map)類型,Name為空,只有Kind。

如果變量是結構體,Name是結構體名,Kind是struct。

ValueOf

TypeOf只能反過來獲取變量的具體類型,但是并不能獲取具體值,這就有點不太厚道了。

所以ValueOf就來解決這個問題了,但是ValueOf牛叉的是,它里面還包括了變量類型。

注:ValueOf和TypeOf的Kind屬性返回內容是一摸一樣的。

需求:定義一個函數,可以接收任意類型,通過反射得出變量類型和變量值。

函數

  1. func reflectType(x interface{}) { 
  2.     v := reflect.ValueOf(x) 
  3.     k := v.Kind() 
  4.     switch k { 
  5.     case reflect.Int
  6.         fmt.Printf("我是Int類型,我的值是%v\n",v.Int()) 
  7.     case reflect.Slice: 
  8.         fmt.Printf("我是切片類型,我的值是%v\n",v.Slice(1,2)) 
  9.     case reflect.Map: 
  10.         fmt.Printf("我是切片類型,我的值是%v\n",v.MapKeys()) 
  11.     //case :可以繼續case下去 
  12.   } 

main

  1. func main() { 
  2.   var a int = 1 
  3.   var c []int = []int{1, 5, 7, 19} 
  4.   var d map[string]interface{} = map[string]interface{}{ 
  5.     "Name""你好", 
  6.     "Age":  18, 
  7.   } 
  8.   var e Student 
  9.   reflectType(a) 
  10.  
  11.   reflectType(c) 
  12.   reflectType(d) 
  13.   reflectType(e) 

執行結果

通過反射設置值

反射還有一個用途,就是動態的修改變量值,可能你暫時體會不到,但是語法還是要學的。

通過反射設置值,需要用到Elem方法,并且傳入的必須是指針。

示例代碼

函數

  1. func reflectSetValue(x interface{}) { 
  2.   v := reflect.ValueOf(x) 
  3.   //kind也必須是Elem調用 
  4.   var k = v.Elem().Kind() 
  5.   switch k { 
  6.   case reflect.Int
  7.     //反射修改必須通過Elem 
  8.     v.Elem().SetInt(200) 
  9.   } 

main

  1. func main() { 
  2.   var a int = 10 
  3.   fmt.Printf("a的值:%v\n", a) 
  4.   //反射修改值傳入的必須是地址 
  5.   reflectSetValue(&a) 
  6.   fmt.Printf("a的值:%v\n", a) 

執行結果

總結

上述我們學習了Go基礎反射的TypeOf,TypeOf的Name和Kind,ValueOf,通過反射設置值。

其中Kind在Type和ValueOf中都有,通常情況下TypeOf和ValueOf一起使用效果更佳!

反射這一塊,可能不是那么好理解,一定要多多下功夫!堅持!!

如果在操作過程中有任何問題,記得下面留言,我們看到會第一時間解決問題。我是碼農星期八,如果覺得還不錯,記得動手點贊一下哈。感謝你的觀看。

本文轉載自微信公眾號「Go語言進階學習」,可以通過以下二維碼關注。轉載本文請聯系Go語言進階學習公眾號。

 

責任編輯:武曉燕 來源: Go語言進階學習
相關推薦

2020-12-20 09:59:13

Go語言基礎技術

2021-09-15 10:00:33

Go語言Modules

2021-05-29 10:20:54

GoModules語言

2019-10-17 19:15:22

jQueryJavaScript前端

2022-02-16 10:03:06

對象接口代碼

2020-11-05 09:58:16

Go語言Map

2020-12-23 08:39:11

Go語言基礎技術

2020-10-22 08:33:22

Go語言

2020-11-11 10:52:54

Go語言C語言

2020-11-13 08:14:28

JavaScript

2023-06-21 00:10:17

JSONWeb服務器JavaScript

2021-02-19 19:35:53

SVG 形狀元素

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語言技術

2020-12-27 10:15:44

Go語言channel管道

2021-02-20 10:06:14

語言文件操作

2020-12-30 09:04:32

Go語言TCPUDP
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲高清在线观看 | 在线观看日韩av | 欧美激情一区二区三区 | 国产综合网址 | 欧美久久天堂 | 精品美女视频在免费观看 | 成年人黄色免费视频 | 久久国产欧美日韩精品 | 一区二区小视频 | 天天夜天天操 | 黄色在线免费观看 | 欧美一区二区三区在线观看 | 国产精品一区二区三区在线 | 久久久久久久电影 | 国产成人小视频 | av电影一区 | 美女三区 | 成人在线视频一区 | 毛片入口 | 精品一区二区在线观看 | 久久se精品一区精品二区 | 视频二区 | 国产露脸国语对白在线 | 日韩不卡三区 | 日韩精品一 | 国产精品96久久久久久 | 在线看av的网址 | 欧美在线国产精品 | 亚洲免费视频一区二区 | 国产色网站 | 免费国产视频 | 国产片侵犯亲女视频播放 | 亚洲男女激情 | 噜啊噜在线 | 日韩av电影在线观看 | 精品日韩欧美一区二区 | 美女久久 | 亚洲欧洲视频 | 81精品国产乱码久久久久久 | 亚洲国产精品一区二区www | 成人在线观看免费 |