Go 語言中的反射
反射是在 java 出現后迅速流行起來的一種概念,通過反射可以獲取豐富的類型信息,并可以利用這些類型信息做非常靈活的工作。大多數現代的高級語言都以各種形式支持反射功能,反射是把雙刃劍,功能強大但代碼可讀性并不理想,若非必要并不推薦使用反射。本文就來介紹一下反射在 Go 語言中的基本使用方法。
1. 通過反射獲取類型
在 Go 語言中提供反射的包為?reflect 包,其中reflect.Type()
函數可以獲取一個變量的類型。
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"reflect"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
test := 10
- 10? ? ? ?
typeOfTest := reflect.TypeOf(test)
- 11? ? ? ?
fmt.Println("變量test的類型:", typeOfTest)
- 12?
}
- 第 9 行:定義一個值為10的變量;
- 第 10 行:通過反射獲取變量的類型。
執行結果:
2. 通過反射獲取值
其中?reflect.ValueOf()
?函數可以獲取一個變量的值。
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"reflect"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
test := 10
- 10? ? ? ?
ValueOfTest := reflect.ValueOf(test)
- 11? ? ? ?
fmt.Println("變量test的值:", ValueOfTest)
- 12?
}
- 第 9 行:定義一個值為 10 的變量;
- 第 10 行:通過反射獲取變量的值。
執行結果:
3. 通過反射修改變量值
上文中我們了解了兩個反射中常用的函數,接下來,我們來學習下如何使用反射來進行一些靈活的操作,比如修改變量的值。
代碼示例:
代碼塊
- 1?
package main
- 2
- 3?
import (
- 4? ? ? ? ?
"fmt"
- 5? ? ? ? ?
"reflect"
- 6?
)
- 7
- 8?
func main() {
- 9? ? ? ? ?
test := 10
- 10? ? ? ?
//獲取test變量的地址
- 11? ? ? ?
ValueOfTestAddr := reflect.ValueOf(&test)
- 12? ? ? ?
//獲取地址存放的值
- 13? ? ? ?
ValueOfTest := ValueOfTestAddr.Elem()
- 14? ? ? ?
//修改這個值
- 15? ? ? ?
ValueOfTest.SetInt(100)
- 16? ? ? ?
fmt.Println("變量test的值:", test)
- 17?
}
執行結果:
使用上述操作,我們就可以在一些情況下操作其它包中的私有變量,這種操作是十分危險的,所以如非必要盡量不要使用。
4. 小結
本文主要是簡單的介紹了以下 Go 語言中的反射的用法。雖然反射的功能強大,但是由于使用的風險比較高,而且對程序的設計會有破壞,所以建議非必要盡量就不要使用了。反射是在 java 出現后迅速流行起來的一種概念,通過反射可以獲取豐富的類型信息,并可以利用這些類型信息做非常靈活的工作。大多數現代的高級語言都以各種形式支持反射功能,反射是把雙刃劍,功能強大但代碼可讀性并不理想,若非必要并不推薦使用反射。
文章來源于網絡,侵刪!