反射 reflection
- 通過反射可以動態的調用方法
- 反射可以通過
TypeOf
和ValueOf
函數從接口中獲取目標對象信息 - 利用反射修改對象狀態
- 反射會將匿名字段作爲獨立字段
通過反射獲取對象的類型和值
示例如下:
package main
import (
"fmt"
"reflect"
)
type User struct {
Id int
Name string
Age int
}
func (u User) Hello(){
fmt.Println("Hello World")
}
//參數o : 可以接收任何類型
func Info(o interface{}){
//獲取參數o的類型
t:= reflect.TypeOf(o)
//打印類型的名稱
fmt.Printf("Type : %v\n", t.Name())
v := reflect.ValueOf(o)
fmt.Println("Fields:")
//遍歷類型的字段
for i:=0;i<t.NumField();i++{
//根據索引取得字段
f := t.Field(i)
//取出字段對應的值
val := v.Field(i).Interface()
fmt.Printf("%5s: %v = %v\n",
f.Name, f.Type, val)
}
}
func main() {
u:= User{1,"Jack",22}
Info(u)
}
打印結果:
Type : User
Fields:
Id: int = 1
Name: string = Jack
Age: int = 22