反射:可以在運行時動態(tài)獲取變量的相關信息

reflect.TypeOf,獲取變量的類型,返回reflect.Type類型
reflect.ValueOf,獲取變量的值,返回reflect.Value類型
reflect.Value.Kind,獲取變量的類別,返回一個常量
reflect.Value.Interface(),轉(zhuǎn)換成interface{}類型
修改變量的值
類型檢查代碼
func getTypeInfo(a interface{}) {
typeInfo := reflect.TypeOf(a)
kind := typeInfo.Kind()
fmt.Println("kind of a:", kind)
//NumMethod :獲取當前變量a 有多少個方法
num := typeInfo.NumMethod()
fmt.Println("method num:", num)
//MethodByName:通過名字獲取方法的定義
method, ok := typeInfo.MethodByName("SetName")
if !ok {
fmt.Println("not have method SetName")
} else {
fmt.Println(method)
}
fmt.Println()
fmt.Println()
}
func getAllMethod(a interface{}) {
typeInfo := reflect.TypeOf(a)
//NumMethod:獲取變量實現(xiàn)方法的個數(shù)
num := typeInfo.NumMethod()
for i := 0;i <num; i++{
method := typeInfo.Method(i)
fmt.Println(method)
}
}
func testGetTypeInfo() {
var i int
getTypeInfo(i)
var stu Student
getTypeInfo(&stu)
var s [5]int
getTypeInfo(s)
}
func testGetAllMethod() {
var stu Student
getAllMethod(&stu)
}func testGetValuInfo() {
var i int = 100
//獲取值相關信息,返回一個結(jié)構(gòu)體
valueInfo := reflect.ValueOf(&i)
//因為修改值,需要傳遞指針,所以呢,使用反射中的 Elem 方法,就是用來修改傳遞指針
valueInfo.Elem().SetInt(200)
tmp := valueInfo.Interface()
val := tmp.(*int)
fmt.Println("val:", val)
fmt.Println("val of valueInfo:", valueInfo.Elem().Int())
fmt.Println("type:", valueInfo.Type())
fmt.Println("kind:", valueInfo.Kind())
fmt.Println("i=", i)
var stu Student
valueInfo = reflect.ValueOf(stu)
fmt.Println("type:", valueInfo.Type())
fmt.Println("kind:", valueInfo.Kind())
}操作結(jié)構(gòu)體
reflect.Value.NumField()獲取結(jié)構(gòu)體中字段的個數(shù)
reflect.Value.Method(n).Call來調(diào)?結(jié)構(gòu)體中的?法
package main
import (
"fmt"
"reflect"
)
type Student struct {
Name string
Age int
Sex int
}
func (s *Student) Set(name string , Age int, Sex int) {
s.Name = name
s.Age = Age
s.Sex = Sex
}
func (s *Student) GetName(name string) {
s.Name = name
}
func testStruct () {
var stu *Student = &Student{}
stu.Set("jim", 18, 1)
valueInfo := reflect.ValueOf(stu)
fieldNum := valueInfo.Elem().NumField()
fmt.Println("field name:", fieldNum)
sexValueInfo := valueInfo.Elem().FieldByName("Sex")
fmt.Println("sex=", sexValueInfo.Int())
sexValueInfo.SetInt(100)
fmt.Println(stu)
setMethod := valueInfo.MethodByName("Set")
fmt.Println(setMethod)
var params []reflect.Value
name := "Tom"
age := 1000
sex := 3883
params = append(params, reflect.ValueOf(name))
params = append(params, reflect.ValueOf(age))
params = append(params, reflect.ValueOf(sex))
setMethod.Call(params)
fmt.Println(stu)
}
func main() {
testStruct()
}創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡助力業(yè)務部署。公司持有工信部辦法的idc、isp許可證, 機房獨有T級流量清洗系統(tǒng)配攻擊溯源,準確進行流量調(diào)度,確保服務器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務器買多久送多久。
新聞名稱:Go(6[反射])-創(chuàng)新互聯(lián)
標題來源:http://www.chinadenli.net/article14/dcdjge.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供用戶體驗、手機網(wǎng)站建設、企業(yè)網(wǎng)站制作、App設計、小程序開發(fā)、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)