新聞中心
本篇內(nèi)容介紹了“go語(yǔ)言反射指的是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

成都創(chuàng)新互聯(lián)公司長(zhǎng)期為近千家客戶(hù)提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為七星關(guān)區(qū)企業(yè)提供專(zhuān)業(yè)的網(wǎng)站制作、成都做網(wǎng)站,七星關(guān)區(qū)網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。
反射的解釋
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
}
“go語(yǔ)言反射指的是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
當(dāng)前題目:go語(yǔ)言反射指的是什么
文章鏈接:http://www.dlmjj.cn/article/gceghd.html


咨詢(xún)
建站咨詢(xún)
