反射是什么?
我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、同安ssl等。為成百上千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的同安網(wǎng)站制作公司
反射是一種計(jì)算機(jī)處理方式。有程序可以訪問(wèn)、檢測(cè)和修改它本身狀態(tài)或行為的這種能力。能提供封裝程序集、類(lèi)型的對(duì)象。(程序集包含模塊,而模塊包含類(lèi)型,類(lèi)型又包含成員。)Golang提供了一種機(jī)制,在編譯時(shí)不知道類(lèi)型的情況下,可更新變量、運(yùn)行時(shí)查看值、調(diào)用方法以及直接對(duì)他們的布局進(jìn)行操作的機(jī)制,稱(chēng)為反射。
為什么使用反射?
打個(gè)比方,有時(shí)候我們需要一個(gè)函數(shù)可以處理各種類(lèi)型的值。在不知道類(lèi)型的情況下,你可能會(huì)這么寫(xiě):
// 偽代碼 switch value := value.(type) { case string: // ...一些操作 case int: // ...一些操作 case cbsStruct: // 自定義的結(jié)構(gòu)體 // ...一些操作 // ... }
有沒(méi)發(fā)現(xiàn)什么問(wèn)題?
這邊存在一個(gè)問(wèn)題:類(lèi)型很多,這個(gè)函數(shù)會(huì)寫(xiě)的非常長(zhǎng),而且還可能存在自定的類(lèi)型,也就是說(shuō)這個(gè)判斷日后可能還要一直改,因?yàn)闊o(wú)法知道未知值到底屬于什么類(lèi)型。
無(wú)法透視一個(gè)未知類(lèi)型的時(shí)候,以上代碼其實(shí)不是很合理,這時(shí)候就需要有反射來(lái)幫忙你處理,反射使用TypeOf和ValueOf函數(shù)從接口中獲取目標(biāo)對(duì)象的信息,輕松完成目的。
3.反射具體能做什么?
package main import ( "fmt" "reflect" ) func main() { var name string = "咖啡色的羊駝" // TypeOf會(huì)返回目標(biāo)數(shù)據(jù)的類(lèi)型,比如int/float/struct/指針等 reflectType := reflect.TypeOf(name) // valueOf返回目標(biāo)數(shù)據(jù)的的值,比如上文的"咖啡色的羊駝" reflectValue := reflect.ValueOf(name) fmt.Println("type: ", reflectType) fmt.Println("value: ", reflectValue) }
golang中提供了reflect包對(duì)反射的支持,其中主要的有兩個(gè)方法和兩個(gè)struct(準(zhǔn)確的說(shuō)是一個(gè)struct和一個(gè)interface),用來(lái)分別獲取和操作接口變量的動(dòng)態(tài)類(lèi)型和動(dòng)態(tài)值。
兩個(gè)方法:
func TypeOf(i interface{}) Type {...}該方法接收一個(gè)空接口類(lèi)型的變量,實(shí)參會(huì)被復(fù)制一份,并轉(zhuǎn)換為空接口變量,最終作為T(mén)ypeOf的參數(shù)。
在函數(shù)內(nèi)部會(huì)將接口變量的動(dòng)態(tài)類(lèi)型信息取出,并封裝到reflect.Type返回,因?yàn)閞eflect.Type是一個(gè)接口,真正使用的是接口的實(shí)例,在這里真正的實(shí)例是reflect.rtype。
func ValueOf(i interface{}) Value {...}與TypeOf 函數(shù)類(lèi)型,接收的也是一個(gè)副本,然后轉(zhuǎn)為空接口變量,在方法內(nèi)部取出接口變量的動(dòng)態(tài)值,然后封裝為一個(gè)reflect.Value對(duì)象返回。
以上就是golang反射重要嗎的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!