Go語言的反射(reflection)是一種強大的機制,它允許程序在運行時檢查、修改變量的類型和值。反射主要使用reflect
包來實現。以下是一些常見的反射應用場景和示例:
reflect.TypeOf()
函數獲取變量的類型信息。package main
import (
"fmt"
"reflect"
)
func main() {
var num int = 42
var str string = "hello"
fmt.Println("Type of num:", reflect.TypeOf(num)) // 輸出: Type of num: int
fmt.Println("Type of str:", reflect.TypeOf(str)) // 輸出: Type of str: string
}
reflect.ValueOf()
函數獲取變量的值。package main
import (
"fmt"
"reflect"
)
func main() {
var num int = 42
var str string = "hello"
fmt.Println("Value of num:", reflect.ValueOf(num)) // 輸出: Value of num: 42
fmt.Println("Value of str:", reflect.ValueOf(str)) // 輸出: Value of str: hello
}
reflect.Value
類型的SetInt()
、SetString()
等方法修改變量的值。package main
import (
"fmt"
"reflect"
)
func main() {
var num int = 42
var str string = "hello"
fmt.Println("Original value of num:", num) // 輸出: Original value of num: 42
fmt.Println("Original value of str:", str) // 輸出: Original value of str: hello
valNum := reflect.ValueOf(&num).Elem()
valStr := reflect.ValueOf(&str).Elem()
valNum.SetInt(100)
valStr.SetString("world")
fmt.Println("Modified value of num:", num) // 輸出: Modified value of num: 100
fmt.Println("Modified value of str:", str) // 輸出: Modified value of str: world
}
reflect.Type
類型的Name()
和PkgPath()
方法獲取字段信息,使用reflect.Value
類型的FieldByName()
方法獲取字段值。package main
import (
"fmt"
"reflect"
)
type Person struct {
Name string
Age int
}
func main() {
p := Person{Name: "Alice", Age: 30}
t := reflect.TypeOf(p)
for i := 0; i < t.NumField(); i++ {
field := t.Field(i)
value := reflect.ValueOf(p).Field(i)
fmt.Printf("Field Name: %s, Field Value: %v\n", field.Name, value.Interface())
}
}
reflect.Type
類型的Name()
方法獲取方法信息,使用reflect.Value
類型的MethodByName()
方法獲取方法值,然后使用Call()
方法調用方法。package main
import (
"fmt"
"reflect"
)
type Calculator struct{}
func (c Calculator) Add(a, b int) int {
return a + b
}
func main() {
calc := Calculator{}
method := reflect.ValueOf(calc).MethodByName("Add")
result := method.Call([]reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)})
fmt.Println("Add result:", result[0].Int()) // 輸出: Add result: 30
}
這些示例展示了Go語言反射的基本用法。需要注意的是,反射通常會降低程序的性能,因此在性能敏感的場景中要謹慎使用。