溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

go語言中的反射

發布時間:2020-06-21 11:08:51 來源:億速云 閱讀:186 作者:元一 欄目:編程語言

反射是什么?

反射是一種計算機處理方式。有程序可以訪問、檢測和修改它本身狀態或行為的這種能力。能提供封裝程序集、類型的對象。(程序集包含模塊,而模塊包含類型,類型又包含成員。)Golang提供了一種機制,在編譯時不知道類型的情況下,可更新變量、運行時查看值、調用方法以及直接對他們的布局進行操作的機制,稱為反射。

為什么使用反射? 

打個比方,有時候我們需要一個函數可以處理各種類型的值。在不知道類型的情況下,你可能會這么寫:

// 偽代碼
switch value := value.(type) {
case string:
    // ...一些操作
case int:   
    // ...一些操作  
case cbsStruct: // 自定義的結構體  
    // ...一些操作

// ...
}

有沒發現什么問題?

這邊存在一個問題:類型很多,這個函數會寫的非常長,而且還可能存在自定的類型,也就是說這個判斷日后可能還要一直改,因為無法知道未知值到底屬于什么類型。

無法透視一個未知類型的時候,以上代碼其實不是很合理,這時候就需要有反射來幫忙你處理,反射使用TypeOf和ValueOf函數從接口中獲取目標對象的信息,輕松完成目的。

3.反射具體能做什么?

package main

import (
    "fmt"
    "reflect"
)

func main() {
    var name string = "咖啡色的羊駝"

    // TypeOf會返回目標數據的類型,比如int/float/struct/指針等
    reflectType := reflect.TypeOf(name)

    // valueOf返回目標數據的的值,比如上文的"咖啡色的羊駝"
    reflectValue := reflect.ValueOf(name)

    fmt.Println("type: ", reflectType)
    fmt.Println("value: ", reflectValue)
}

golang中提供了reflect包對反射的支持,其中主要的有兩個方法和兩個struct(準確的說是一個struct和一個interface),用來分別獲取和操作接口變量的動態類型和動態值。

兩個方法:

func TypeOf(i interface{}) Type {...} 該方法接收一個空接口類型的變量,實參會被復制一份,并轉換為空接口變量,最終作為TypeOf的參數。

在函數內部會將接口變量的動態類型信息取出,并封裝到reflect.Type返回,因為reflect.Type是一個接口,真正使用的是接口的實例,在這里真正的實例是reflect.rtype。

func ValueOf(i interface{}) Value {...} 與TypeOf 函數類型,接收的也是一個副本,然后轉為空接口變量,在方法內部取出接口變量的動態值,然后封裝為一個reflect.Value對象返回。

以上就是golang反射重要嗎的詳細內容,更多請關注億速云其它相關文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女