一、反射獲取型別物件與值
package main
import (
"fmt"
"reflect"
)
func main() {
a := 36
atype := reflect.TypeOf(a)
fmt.Println(atype.Name()) //獲取型別名稱為int
avalue := reflect.ValueOf(a)
fmt.Println(avalue.Int()) //獲取具體的數值
}
二、反射獲取結構體型別名稱與型別
package main
import (
"fmt"
"reflect"
)
type myobject struct {
Name string
Sex int
Age int `json:"age"`
}
func main() {
typeof := reflect.TypeOf(myobject{})
fmt.Println(typeof.Name()) //獲取反射型別物件 myobject
fmt.Println(typeof.Kind()) //獲取反射型別種類 myobject
}
三、反射獲取指標名稱和型別
package main
import (
"fmt"
"reflect"
)
type myobject struct {
Name string
Sex int
Age int `json:"age"`
}
func main() {
typeof := reflect.TypeOf(&myobject{})
fmt.Println(typeof.Elem().Name()) //獲取指標型別指向的元素型別的名稱
fmt.Println(typeof.Elem().Kind()) //獲取指標型別指向的元素型別的種類
}
四、反射獲取結構體成員的型別
package main
import (
"fmt"
"reflect"
)
type myobject struct {
Name string
Sex int
Age int `json:"age"`
}
func main() {
typeof := reflect.TypeOf(myobject{})
fieldnum := typeof.NumField() //獲取結構體成員欄位的數量
for i := 0; i < fieldnum; i++ {
fieldname := typeof.Field(i) //索引對應的欄位資訊
fmt.Println(fieldname)
name, err := typeofmystruct.FieldByName("Name")//根據指定的字串回傳對應的欄位資訊
fmt.Println(name, err)
}
}
五、反射值物件獲取任意值
package main
import (
"fmt"
"reflect"
)
func main() {
a := 2020
valof := reflect.ValueOf(a) //先通過reflect.ValueOf 獲取反射的值物件
fmt.Println(valof)
//再通過值物件通過型別斷言轉換為指定型別
fmt.Println(valof.Interface()) //轉換為interface{} 型別
fmt.Println(valof.Int()) //將值以int型別回傳
}
注意:.Interface() 將值以interface{}任意型別回傳,還有各自對應的型別, .Int()、.Uint() 、.Floact() 、.Bool() 、.Bytes() 、.String(),
六、反射獲取結構體的成員欄位的值
package main
import (
"fmt"
"reflect"
)
type myobject struct {
Name string
Age int
}
func main() {
h := myobject{"測驗", 20}
fmt.Println(h)
hofvalue := reflect.ValueOf(h) //獲取結構體的reflect.Value物件,
for i := 0; i < hofvalue.NumField(); i++ { //回圈結構體內欄位的數量
//獲取結構體內索引為i的欄位值
fmt.Println(hofvalue.Field(i).Interface())
}
fmt.Println(hofvalue.Field(1).Type()) //獲取結構體內索引為1的欄位的型別
}
七、反射物件的空值處理
package main
import (
"fmt"
"reflect"
)
func main() {
var a *int //宣告一個變數a為nil的空指標
fmt.Println(reflect.ValueOf(a).IsNil()) //判斷是否為nil 回傳true
//當reflect.Value不包含任何資訊,值為nil的時候IsValid()就回傳false
fmt.Println(reflect.ValueOf(nil).IsValid())
}
八、反射值物件修改變數的值
package main
import (
"fmt"
"reflect"
)
func main() {
//宣告變數a
a := 100
fmt.Printf("a的記憶體地址為:%p\n", &a)
//獲取變數a的反射型別reflect.Value 的地址
rf := reflect.ValueOf(&a)
fmt.Println("通過反射獲取變數a的地址:", rf)
//獲取a的地址的值
rval := rf.Elem()
fmt.Println("反射a的值:", rval)
//修改a的值
rval.SetInt(200)
fmt.Println("修改之后反射型別的值為:", rval.Int())
//原始值也被修改
fmt.Println("原始a的值也被修改為:", a)
}
注意:
SetInt(x) 設定值為x, 型別必須是int型別,
SetUint(x) 設定值為x, 型別必須是uint型別,
SetFloat(x) 設定值為x, 型別必須是float32或者float64型別,
SetBool(x) 設定值為x, 型別必須是bool型別,
SetBytes(x) 設定值為x, 型別必須是[]Byte型別,
SetString(x) 設定值為x, 型別必須是string型別,
九、反射呼叫函式方法
package main
import (
"fmt"
"reflect"
)
func myfunc(a, b int) int {
return a + b
}
func main() {
r_func := reflect.ValueOf(myfunc)
//設定函式需要傳入的引數也必須是反射型別
params := []reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)}
//反射呼叫函式
res := r_func.Call(params)
//獲取回傳值
fmt.Println(res[0].Int())
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/262978.html
標籤:區塊鏈
上一篇:星啟航 創輝煌星云系統發布暨IPFS技術討論會在深圳成功舉辦
下一篇:常見的六種哈希建構式
