Go(6 [反射])

释放双眼,带上耳机,听听看~!

反射:可以在运行时动态获取变量的相关信息

reflect.TypeOf,获取变量的类型,返回reflect.Type类型
reflect.ValueOf,获取变量的值,返回reflect.Value类型
reflect.Value.Kind,获取变量的类别,返回一个常量

reflect.Value.Interface(),转换成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:获取变量实现方法的个数	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	//获取值相关信息,返回一个结构体	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())}

操作结构体

reflect.Value.NumField()获取结构体中字段的个数

reflect.Value.Method(n).Call来调⽤结构体中的⽅法

package mainimport (	"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()}

【转自慕课】https://www.imooc.com

Go

Go语言中时间函数及定时器的使用

2022-3-3 8:47:26

Go

Golang之wait.Until 简单测试用例

2022-3-3 8:48:37

搜索