首頁  >  文章  >  後端開發  >  golang反射重要嗎

golang反射重要嗎

(*-*)浩
(*-*)浩原創
2019-12-03 13:37:412862瀏覽

golang反射重要嗎

Golang提供了一種機制,在編譯時不知道類型的情況下,可更新變數、運行時查看值、呼叫方法以及直接對他們的佈局進行操作的機制,稱為反射。

為什麼要使用反射?                     (建議學習:go

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

// 伪代码
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反射重要嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn