Go語言的反射(reflection)是一種強大的機制,它允許程序在運行時檢查、修改變量的類型和值。反射在許多場景中都非常有用,例如動態調用函數、序列化和反序列化數據、實現通用的數據結構和算法等。
以下是Go語言反射的一些常見用法:
import "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
}
import "fmt"
import "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
}
import (
"fmt"
"reflect"
)
func add(a, b int) int {
return a + b
}
func main() {
funcValue := reflect.ValueOf(add)
args := []reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)}
result := funcValue.Call(args)
fmt.Println("Result of add:", result[0].Int()) // 輸出:Result of add: 30
}
import (
"fmt"
"reflect"
)
func main() {
num := 42
fmt.Println("Original value of num:", num) // 輸出:Original value of num: 42
reflectValue := reflect.ValueOf(&num).Elem()
reflectValue.SetInt(100)
fmt.Println("Modified value of num:", num) // 輸出:Modified value of num: 100
}
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())
}
}
import (
"fmt"
"reflect"
)
func printSlice(s interface{}) {
v := reflect.ValueOf(s)
for i := 0; i < v.Len(); i++ {
fmt.Printf("%v ", v.Index(i).Interface())
}
fmt.Println()
}
func main() {
slice := []int{1, 2, 3, 4, 5}
printSlice(slice) // 輸出:1 2 3 4 5
slice = []string{"hello", "world"}
printSlice(slice) // 輸出:hello world
}
這些示例展示了Go語言反射的一些基本用法。要充分利用反射,你需要熟悉reflect
包中的函數和類型,并根據具體需求進行相應的操作。但請注意,反射可能會導致性能下降和安全風險,因此在適當的情況下謹慎使用。