溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Go(6 [反射])

發(fā)布時間:2020-07-25 12:41:37 來源:網(wǎng)絡(luò) 閱讀:464 作者:zhaichaoqun 欄目:編程語言

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

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 :獲取當(dāng)前變量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
	//獲取值相關(guān)信息,返回一個結(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()
}


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI