Go 語言的反射機制允許程序在運行時檢查、修改變量類型和值,以及調用方法。以下是 Go 語言反射機制的一些常見應用:
var i interface{} = "hello"
if str, ok := i.(string); ok {
fmt.Println(str) // 輸出:hello
}
type Person struct {
Name string
Age int
}
p := Person{Name: "Alice", Age: 30}
v := reflect.ValueOf(p)
fmt.Println(v.FieldByName("Name").String()) // 輸出:Alice
func (p Person) SayHello() {
fmt.Println("Hello, my name is", p.Name)
}
reflect.ValueOf(p).MethodByName("SayHello").Call(nil) // 輸出:Hello, my name is Alice
slice := []int{1, 2, 3}
for i := 0; i < slice.Len(); i++ {
fmt.Println(slice.Index(i))
}
m := map[string]int{"one": 1, "two": 2, "three": 3}
for k, v := range m {
fmt.Println(k, v)
}
func PrintSlice(slice interface{}) {
v := reflect.ValueOf(slice)
for i := 0; i < v.Len(); i++ {
fmt.Println(v.Index(i).Interface())
}
}
numbers := []int{1, 2, 3}
strings := []string{"one", "two", "three"}
PrintSlice(numbers)
PrintSlice(strings)
請注意,反射通常會降低代碼的性能,并且可能導致運行時錯誤。因此,在使用反射之前,請確保沒有其他更合適的方法。