老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業(yè)提供網(wǎng)站建設(shè)、域名注冊(cè)、服務(wù)器等服務(wù)

go語(yǔ)言的反射是什么意思

這篇文章主要介紹“go語(yǔ)言的反射是什么意思”,在日常操作中,相信很多人在go語(yǔ)言的反射是什么意思問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”go語(yǔ)言的反射是什么意思”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)公司致力于互聯(lián)網(wǎng)網(wǎng)站建設(shè)與網(wǎng)站營(yíng)銷(xiāo),提供成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、網(wǎng)站開(kāi)發(fā)、seo優(yōu)化、網(wǎng)站排名、互聯(lián)網(wǎng)營(yíng)銷(xiāo)、重慶小程序開(kāi)發(fā)、公眾號(hào)商城、等建站開(kāi)發(fā),創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)策劃專(zhuān)家,為不同類(lèi)型的客戶(hù)提供良好的互聯(lián)網(wǎng)應(yīng)用定制解決方案,幫助客戶(hù)在新的全球化互聯(lián)網(wǎng)環(huán)境中保持優(yōu)勢(shì)。

 

反射的解釋

Go 語(yǔ)言中的反射與其他語(yǔ)言有比較大的不同,Golang 中的發(fā)射主要涉及到兩個(gè)基本概念 Type 和 Value,它們也是 Go 語(yǔ)言包中 reflect 包 里最重要的兩個(gè)類(lèi)型。

在 Golang 中對(duì)所有 接口 進(jìn)行反射,都可以得到一個(gè)包含 Type 和 Value 的信息結(jié)構(gòu)。顧名思義,Type 主要表達(dá)的是被反射的這個(gè)變量本身的類(lèi)型信息,而 Value 則為該變量實(shí)例本身的信息。

 

反射的作用

Golang 中的反射主要有兩個(gè)作用,即,獲取類(lèi)型信息和獲取值類(lèi)型。

利用反射我們可以:

  • 動(dòng)態(tài)解析
  • 函數(shù)的封裝
  • ...
 

反射獲取數(shù)據(jù)類(lèi)型

語(yǔ)法:

reflect.TypeOf(x)

作用:

獲取數(shù)據(jù)類(lèi)型

用法:

package main
import (
"fmt"
"reflect"
)
func main() {
var x = 3.4
var str = "Hello World"
fmt.Println("x type =", reflect.TypeOf(x))
fmt.Println("str type =", reflect.TypeOf(str))
}
   

反射獲取Type

語(yǔ)法:

reflect.TypeOf(varname)

作用:

可以獲取該變量對(duì)應(yīng)的值。

用法:

package main
import (
"fmt"
"reflect"
)
func main() {
var x = 1024
var str = "Hello World"
fmt.Println("x type =", reflect.TypeOf(x))
fmt.Println("str type =", reflect.TypeOf(str))
}

   

反射獲取Type

語(yǔ)法:

reflect.TypeOf(varname).Kind()

作用:

使用 reflect.TypeOf 傳入我們要獲取的變量,即可以獲取該變量的類(lèi)型,同時(shí)使用 Kind 方法可以獲取該類(lèi)型的詳細(xì)信息

用法:

package main
import (
"fmt"
"reflect"
)
func main() {
var x = 1024
var str = "Hello World"
typeX := reflect.TypeOf(x)
typeStr := reflect.TypeOf(str)
typexKind := typeX.Kind()
typeStrKind := typeStr.Kind()
fmt.Println("x type =", typeX, ", Kind =", typexKind)
fmt.Println("str type =", typeStr, ", Kind =", typeStrKind)
}
   

反射獲取變量值信息

語(yǔ)法:

reflect.ValueOf(varname)

作用:

使用 reflect.ValueOf 傳入我們要獲取的變量,可以獲取該變量的值信息

用法:

package main
import (
"fmt"
"reflect"
)
func main() {
var x = 1024
var str = "Hello World"
valueX := reflect.ValueOf(x)
valueStr := reflect.ValueOf(str)
fmt.Println("valueX =", valueX)
fmt.Println("valueStr =", valueStr)
}
   

反射獲取變量所指向的指針

語(yǔ)法:

reflect.ValueOf(varname).Elem()

作用:

使用 reflect.ValueOf 傳入我們要獲取的變量,可以獲取該變量的值信息

用法:

package main
import (
"fmt"
"reflect"
)
func main() {
var x = 1024
var str = "Hello World"
valueX := reflect.ValueOf(x)
valueStr := reflect.ValueOf(str)
fmt.Println("valueX =", valueX)
fmt.Println("valueStr =", valueStr)
valueElemX := valueX.Elem()
valueElemStr := valueStr.Elem()
fmt.Println("valueElemX =", valueElemX)
fmt.Println("valueElemStr =", valueElemStr)
}
   

反射調(diào)用結(jié)構(gòu)體方法

語(yǔ)法:

personValue := reflect.ValueOf(p)
infoFunc := personValue.MethodByName("Info")
infoFunc.Call([]reflect.Value{})
 

作用:

通過(guò) reflect.ValueOf 獲取結(jié)構(gòu)體的值信息,再次使用結(jié)構(gòu)體值信息的 MethodByName 獲取結(jié)構(gòu)體的方法,最后使用 Call 方法可以實(shí)現(xiàn)調(diào)用結(jié)構(gòu)體的方法

用法:

import (
   "fmt"
   "reflect"
)
type Student struct {
   Name string
   Age int
   Score float64
}
func (s Student)Info(){
   fmt.Println("Name =", s.Name, "Age =", s.Age, "Score =", s.Score)
}
func main() {
   var p = Student{
       Name:"Jim",
       Age:10,
       Score:99,
   }
   personValue := reflect.ValueOf(p)
   infoFunc := personValue.MethodByName("Info")
   infoFunc.Call([]reflect.Value{})
}
   

組合使用

下面這段代碼使用了TypeOf,來(lái)處理結(jié)構(gòu)體里面包含的數(shù)組、時(shí)間類(lèi)型的值??梢宰鳛橐粋€(gè)通用的反射方式使用.


func reflect(o interface{}) error {
re := reflect.TypeOf(o).Elem()
rv := reflect.ValueOf(o).Elem()
//判斷是否為結(jié)構(gòu)體
if re.Kind() == reflect.Struct {
for i := 0; i < re.NumField(); i++ {
f := re.Field(i)
name := f.Name
fmt.Printf("field name %v :" ,name)
//獲取結(jié)構(gòu)體其中一個(gè)字段的值
v := rv.FieldByName(name)
if v.Kind() == reflect.Struct {
//處理時(shí)間類(lèi)型
if v.Type().ConvertibleTo(reflect.TypeOf(time.Time{})) {
fmt.Printf("field name : %v type of time" ,name)
continue
}
//判斷是否為空
if !v.IsNil() {
fmt.Printf("field name : %v is empty" ,name)
continue
}
//TODO 此處沒(méi)有業(yè)務(wù)邏輯可以補(bǔ)充
}
//處理數(shù)組類(lèi)型
if v.Kind() == reflect.Slice {
                           for j := 0; j < v.Len(); j++ {
                                   //判斷數(shù)組里面的對(duì)象是否為指針類(lèi)型
                                   if reflect.TypeOf(v.Index(j).Interface()).Kind() == reflect.Ptr {
                                           fmt.Printf("field name : %v type of Ptr" ,name)
                                           continue
                                   }
                           }
}

}
}
return nil
}


總結(jié)

反射作為一個(gè)很有用的特性,我們應(yīng)該靈活使用,不應(yīng)過(guò)度或者不加思考的使用。

到此,關(guān)于“go語(yǔ)言的反射是什么意思”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!


文章題目:go語(yǔ)言的反射是什么意思
分享網(wǎng)址:http://www.xueling.net.cn/article/gdgpoj.html

其他資訊

在線咨詢(xún)
服務(wù)熱線
服務(wù)熱線:028-86922220
TOP
主站蜘蛛池模板: 农村少妇一级毛片 | 欧美小视频在线观看 | 婷婷综合缴情亚洲AV | 综合精品久久久 | 亚洲www在线 | 国产精品久久嫩一区二区免费 | av片免费播放 | 国产干b视频 | 国产大屁股喷水视频在线观看 | 国产国产成年年人免费看片 | 热逼视频| 国产超碰女人任你爽 | 国产成人精品无码A区在线观看 | 久久精品黄色 | 欧美视频网站 | 亚洲精品无码一区二区卧室 | 欧美XXXX18性欧美| 国内精品久久久久久久影视 | 免费无码国产欧美久久18 | 嫩草影院入口ncyy | 国产在线视频欧美一区二区三区 | 精品一区二区男人吃奶 | 男人天堂亚洲天堂 | 午夜精品久久久久久99热软件 | 爱妺妺国产AV网站 | 去看片在线 | 日韩人妻无码系列专区 | 国产男女视频在线 | 中文字幕2018第一页 | 亚洲一及片| 国产xxxxx在线观看免费 | 女社长湿润丝袜在线观看 | 中国亚洲女人69内射少妇 | 伊人久久大香线蕉AV一区 | 欧美四级在线观看 | 国产精欧美一区二区三区白种人 | 亚洲AV日韩AV永久无码色欲 | 99视频国产精品免费观看 | 国产aa级| 伊人狠狠色丁香婷婷综合动态图 | 国产一区二区三区不卡视频网站 |