16 Go的反射

概述

????????在上一節的內容中,我們介紹了Go的并發,包括:Goroutines、Channels、WaitGroups、Mutex、Select等。在本節中,我們將介紹Go的反射。Go語言中的反射是一種在運行時檢查類型信息并操作對象的能力,通過反射,你可以動態地檢查變量的類型、調用函數、修改變量的值。在Go語言中,反射主要通過reflect包來實現。這個包提供了一組函數,用于在運行時動態地分析和操作對象的類型和值。

????????反射是一種強大而復雜的特性,通常不建議在常規的程序中使用過多。因此,下面只介紹一些常見的反射操作。

reflect.TypeOf

????????reflect.TypeOf函數用于在運行時動態地獲取一個值的類型信息,其語法如下:

??????????func reflect.TypeOf(value) reflect.Type

????????其中,value是要獲取類型信息的值。reflect.TypeOf返回一個reflect.Type類型的值,表示該值的類型信息。reflect.Type是一個接口類型,它定義了一些函數用于操作類型信息,比如:String函數用于獲取類型的字符串表示,Kind函數用于獲取類型的種類等。

package mainimport ("fmt""reflect"
)  func main() {var num float64 = 3.14t := reflect.TypeOf(num)// 均輸出: float64fmt.Println(t)fmt.Println(t.String())fmt.Println(t.Kind())
}

reflect.ValueOf

????????reflect.ValueOf函數用于獲取一個值的反射對象,其語法如下:

??????????func ValueOf(v interface{}) reflect.Value

????????其中,v是一個interface{}類型的值,可以是任意類型的值。函數返回一個reflect.Value類型的對象,表示該值的反射對象。reflect.Value類型是反射包中最重要的類型之一,它提供了一組函數用于操作類型的值,比如:獲取值的類型、地址、值等。

package mainimport ("fmt""reflect"
)func main() {var text string = "Hello, CSDN"value := reflect.ValueOf(text)// 輸出: Hello, CSDNfmt.Println(value)
}

reflect.Value

????????通過reflect.Value的Set函數可以修改變量的值。注意:只有當變量是可尋址且可修改的時候,Set函數才能成功。

package mainimport ("fmt""reflect"
)func main() {var num float64 = 66.6value := reflect.ValueOf(&num).Elem()  value.SetFloat(88.8)// 輸出: 88.8fmt.Println(num)
}

????????除此之外,還可以通過reflect.Value的MethodByName函數調用結構體的方法。

????????在下面的示例代碼中,我們定義了一個名為Person的結構體,并綁定了函數OuputInfo。然后,我們使用reflect.ValueOf()函數獲取了person對象的反射對象value。接下來,我們通過value的MethodByName函數獲取了函數OuputInfo的指針。最后,我們使用Call()方法調用函數,并將參數列表傳遞給它。

package mainimport ("fmt""reflect"
)type Person struct {name string
}func (person Person) OuputInfo(age int) {fmt.Println("name is", person.name, ", age is", age)
}func main() {person := Person{name: "Mike"}value := reflect.ValueOf(person)method := value.MethodByName("OuputInfo")// 創建參數列表  args := []reflect.Value{reflect.ValueOf(15),}// 輸出: name is Mike , age is 15method.Call(args)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/165528.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/165528.shtml
英文地址,請注明出處:http://en.pswp.cn/news/165528.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

STM32_6(TIM)

TIM定時器(第一部分) TIM(Timer)定時器定時器可以對輸入的時鐘進行計數,并在計數值達到設定值時觸發中斷16位計數器、預分頻器、自動重裝寄存器的時基單元,在72MHz計數時鐘下可以實現最大59.65s的定時不僅…

在游戲開發中,實時渲染和離線渲染對于游戲平衡的影響有哪些?

實時渲染和離線渲染對游戲平衡有那些影響呢?在游戲開發中,渲染方式的選擇對游戲的整體表現和玩家體驗有著至關重要的作用。那么,實時渲染和離線渲染究竟有哪些利弊呢? 一、實時渲染 實時渲染,顧名思義,是…

Ubuntu 1.84.2Visual Studio Code 下載配置與vscode查看內存Hex Editor插件,簡單易懂

目錄 前言 一 首先我為啥要重裝Vs Code呢? 二 下載1.84.2Visual Studio Code 三 配置Vscode終端字體 四 安裝插件 前言 這是一篇將老版本的VsCode下載至最新版的博文,從下載到調試全篇 一 首先我為啥要重裝Vs Code呢? 因為我想安裝這個…

網絡安全深入學習第九課——本機信息收集

文章目錄 一、Windows基本信息收集1、查看當前權限2、查看指定用戶的詳細信息3、查看用戶SID4、查看網卡配置5、查看服務器版本\補丁等6、查看系統架構7、查看安裝的軟件及版本8、查看本機服務信息9、查詢進程信息和列表10、查看啟動程序信息11、查看計劃任務12、查看主機開機時…

1、postman的安裝及使用

一、安裝、登錄 1.安裝 下載地址 2.注冊登錄(保存云服務進度) 二、界面介紹 三、執行接口測試頁面 請求頁簽: 1、params:當是get請求時,通過params傳參 2、authorization:鑒權 3、headers&#xff1…

大數據-之LibrA數據庫系統告警處理(ALM-37000 MPPDBServer數據目錄或Redo目錄缺失)

告警解釋 當出現如下情況時,產生該告警: 數據實例數據目錄被刪除。數據實例Redo目錄(pg_xlog)被刪除。 告警屬性 告警ID 告警級別 可自動清除 37000 嚴重 是 告警參數 參數名稱 參數含義 ServiceName 產生告警的服務…

OTP語音芯片WTN6系列:多樣化選擇,滿足各種產品應用需求

隨著科技的快速發展,語音芯片已經成為了智能產品中不可或缺的核心組件。在這個領域中,唯創知音OTP語音芯片WTN6系列以其出色的性能和多樣化的選擇,贏得了廣大開發者的青睞。本文將詳細介紹WTN6系列的幾個重要型號及其特點,并為讀者…

idea 26 個天花板技巧

1、 查看代碼歷史版本;2、 調整idea的虛擬內存:;3、 idea設置成eclipse的快捷鍵;4、 設置提示詞忽略大小寫;5、 關閉代碼檢查;6、 設置文檔注釋模板;7、 顯示方法分隔符;8、 設置多行…

DAOS低時延與高性能RDMA網絡

什么是RDMA RDMA(Remote Direct Memory Access)遠程直接內存訪問是一種技術,它使兩臺聯網的計算機能夠在主內存中交換數據,而無需依賴任何一臺計算機的處理器、緩存或操作系統。與基于本地的直接內存訪問 ( DMA ) 一樣&#xff0c…

C++ Qt屬性Property使用介紹

文章目錄 C++ 普通類使用Qt屬性Qt窗口類使用屬性自定義控件使用屬性在 Qt 中,屬性(Property)系統提供了一種機制來定義對象的屬性。這些屬性可以在運行時動態地查詢和修改,而且可以通過設計師工具進行可視化編輯。Qt 屬性系統還支持屬性綁定、動畫和其他高級特性。 屬性在…

DFS連通塊問題

DFS連通塊問題 只要是位置的上下左右都有 ‘1’ 的就是同一塊連通塊 一般題目類型有: 連通塊中數量最多的連通塊聯通塊的數量 110010000011111110101001001001101010111011011011101001111110 010000000001010001101100000010010110001111100010101100011110 00…

5-linux-用戶操作、su和sudo、普通權限、特殊權限、解壓壓縮、軟件管理(rpm和yum)、源碼安裝nginx、系統服務、進程管理

1 用戶操作 2 su和sudo 3 普通權限 4 特殊權限 5 解壓壓縮 6 軟件管理,rpm和yum 6.1 rpm 6.2 yum 7 源碼安裝nginx 8 系統服務 9 進程管理 1 用戶操作 ####創建用戶####1 創建sa和sutdents組 groupadd sa groupadd students # 2 用戶可以屬于多個組,只…

03-詳細介紹Stream及其常用API

Stream API Stream API(java.util.stream)把真正的函數式編程風格引入到Java中,可以極大地提高程序員生產力,讓程序員寫出高效、簡潔的代碼 實際開發中項目中多數數據源都是來自MySQL、Oracle等關系型數據庫,還有部分來自MongDB、Redis等非關系型數據庫 從關系型…

1.測試基礎

目錄 一、測試基礎 1.軟件測試中基礎信息定義 2.測試主流技能 3.常見的測試分類 3.1按階段劃分 3.2按代碼可見度劃分 3.3其他 4.測試模型 5.測試流程 6.測試用例 二、用例設計方法 2.1等價類 2.2 邊界值 2.3判定表法 2.4場景法 2.5錯誤推測法 三、缺陷管理 1…

文章解讀與仿真程序復現思路——電力系統自動化EI\CSCD\北大核心《交直流配電網中柔性軟開關接入的規劃-運行協同優化方法》

這個標題涉及到交直流配電網中柔性軟開關接入的規劃-運行協同優化方法。下面是對這個標題各部分的詳細解讀: 交直流配電網: 這指的是一個電力系統,同時包含交流和直流電力傳輸的元素。這樣的系統可能結合了傳統的交流電力傳輸和近年來興起的直…

python中一個文件(A.py)怎么調用另一個文件(B.py)中定義的類AA詳解和示例

本文主要講解python文件中怎么調用另外一個py文件中定義的類,將通過代碼和示例解讀,幫助大家理解和使用。 目錄 代碼B.pyA.py 調用過程 代碼 B.py 如在文件B.py,定義了類別Bottleneck,其包含卷積層、正則化和激活函數層,主要對…

WordPress用sql命令批量刪除所有文章

有時我們需要將一個網站搬遷到另一個服務器。我們只想保留網站的模板樣式,而不需要文章內容。一般情況下我們可以在后臺刪除已發表的文章,但如果有很多文章,我們則需要一次刪除所有文章。 WordPress如何批量刪除所有文章 進入網站空間后臺&a…

常見樹種(貴州省):013桉樹、米櫧、栲類

摘要:本專欄樹種介紹圖片來源于PPBC中國植物圖像庫(下附網址),本文整理僅做交流學習使用,同時便于查找,如有侵權請聯系刪除。 圖片網址:PPBC中國植物圖像庫——最大的植物分類圖片庫 一、桉樹 …

Java中的字符串String

目錄 一、常用方法 1、字符串構造 2、String對象的比較 (1)、equals方法 (2)、compareTo方法 (3)、compareToIgnoreCase方法(忽略大小寫進行比較) 3、字符串查找 4、轉化 &…

4.3 實時陰影

一、基于圖像的陰影技術(Shadow Map) 什么是陰影 當來自光源的至少一個點在空間中被遮擋時,就產生了陰影區域。 陰影的前提 直接光照不透明物體 陰影的實現方式 陰影體(Shadow Volumes)——空間中黑暗部分的幾何…