Go 反射 學習筆記
反射reflection
- 反射可大大提高程式的靈活性,使得 interface{} 有更大的發揮餘地
- 反射使用 TypeOf 和 ValueOf 函式從介面中獲取目標物件資訊
- 反射會將匿名欄位作為獨立欄位(匿名欄位本質)
- 列想要利用反射修改物件狀態,前提是 interface.data 是 settable,
即 pointer-interface - 通過反射可以“動態”呼叫方法
1、獲取目標物件資訊
package main
import (
"fmt"
"reflect"
)
type NokiaPhone struct {
//注意需要是大寫即公共的
Name string
Sale int
Tag string
}
// func (nokiaPhone NokiaPhone) Say() {
// fmt.Println("hello world")
// }
func main() {
pp := NokiaPhone{"name", 22, "tag"}
GetInfo(pp)
// GetInfo(&pp)
}
func GetInfo(phone interface{}) {
t := reflect.TypeOf(phone)
fmt.Println("Type:", t.Name())
//型別判斷
if k := t.Kind(); k != reflect.Struct {
fmt.Println("...")
return
}
v := reflect.ValueOf(phone)
fmt.Println("Fields:")
for i := 0; i < t.NumField(); i++ {
f := t.Field(i)
val := v.Field(i).Interface()
// fmt.Println(f.Name)
// fmt.Println(f.Type)
// fmt.Println(val)
fmt.Println("%6s:%v=%v\n:", f.Name, f.Type, val)
}
for i := 0; i < t.NumMethod(); i++ {
m := t.Method(i)
fmt.Println("%6s:%v\n:", m.Name, m.Type)
}
}
輸出結果:
2、修改欄位
package main
import (
"fmt"
"reflect"
)
type NokiaPhone struct {
//注意需要是大寫即公共的
Name string
Sale int
Tag string
}
func main() {
u := NokiaPhone{"xiaomi", 1999, "shiwu"}
Set(&u)
fmt.Println(u)
}
func Set(o interface{}) {
v := reflect.ValueOf(o)
if v.Kind() == reflect.Ptr && !v.Elem().CanSet() {
fmt.Println("XXX")
return
} else {
v = v.Elem()
}
f := v.FieldByName("Name1")
if !f.IsValid() {
fmt.Println("wuxiao")
return
}
if f.Kind() == reflect.String {
f.SetString("ok")
}
}
輸出結果:
3、呼叫方法
package main
import (
"fmt"
"reflect"
)
type NokiaPhone struct {
//注意需要是大寫即公共的
Name string
Sale int
Tag string
}
func (nokiaPhone NokiaPhone) Say(name string) {
fmt.Println("hello world")
}
func main() {
u := NokiaPhone{"xiaoneng", 1999, "diaosi"}
v := reflect.ValueOf(u)
mv := v.MethodByName("Say")
args := []reflect.Value{reflect.ValueOf("huawei")}
mv.Call(args)
}
輸出結果:
本文參考整理自:《Go 程式設計基礎》
個人微信公眾號:
作者:jiankunking 出處:http://blog.csdn.net/jiankunking
相關文章
- GO語言學習筆記-反射篇 Study for Go ! Chapter nine - ReflectGo筆記反射APT
- Java學習筆記--反射Java筆記反射
- Java學習筆記系列-反射Java筆記反射
- Go 學習筆記Go筆記
- 註解和反射學習筆記反射筆記
- GO 方法學習筆記Go筆記
- go channel學習筆記Go筆記
- go defer 學習筆記Go筆記
- go 學習筆記---切片Go筆記
- Go 方法 學習筆記Go筆記
- Go 介面 學習筆記Go筆記
- JAVA核心技術學習筆記--反射Java筆記反射
- Java註解與反射學習筆記Java反射筆記
- 【學習筆記】Go Modules 使用筆記Go
- Go 進階學習筆記Go筆記
- go 閉包學習筆記Go筆記
- go 學習筆記---map(字典)Go筆記
- 【Go學習筆記4】切片Go筆記
- Go 函式 學習筆記Go函式筆記
- Go 結構 學習筆記Go筆記
- go學習筆記——gin框架Go筆記框架
- java反射之動態代理學習筆記Java反射筆記
- 筆記-go反射操作私有變數筆記Go反射變數
- go 學習筆記之初識 go 語言Go筆記
- Go基礎學習記錄之反射(reflect)機制Go反射
- Go 入門指南學習筆記Go筆記
- GO 學習筆記->結構體Go筆記結構體
- go-ethereum學習筆記(一)Go筆記
- Go學習筆記-GMP詳解Go筆記
- Go學習筆記-Zap日誌Go筆記
- Go型別特性-學習筆記Go型別筆記
- go學習筆記劃重點Go筆記
- 【Go學習筆記16】解析xmlGo筆記XML
- 【Go學習筆記15】解析yamlGo筆記YAML
- 【python學習筆記】Python反射機制Python筆記反射
- 【Go】Go語言學習筆記-3-包Go筆記
- Go學習筆記 - Go 基礎語法(1)Go筆記
- Go 學習筆記 - Go 基礎語法(2)Go筆記