golang 通过反射来修改变量的值(传址方式)

package main

import (
"fmt"
"reflect"
)

/*
通过反射来修改变量的值
1、定义结构体
2、通过valueof获取反射的结构体信息
3、通过valueof的值获取属性长度及属性值
4、通过valueof的值获取方法信息

*/

//定义结构体体

type Student struct {
Name string
Age int
}

//结构体绑定方法 APrint 打印信息方法

func (s Student) APrint() {
fmt.Println("调用了print方法")
fmt.Println("名字是:", s.Name)
}

// Bset
func (s Student) Bset(name string, age int) {
s.Name = name
s.Age = age
}

// Csum
func (s Student) Csum(num1, num2 int) int {
return num1 + num2
}

/*
定义一个函数 TestStudentStruct()
1、获取结构体反射值 valueof
2、通过结构体反射值获取结构体属性长度及值
3、通过结构体反射值获取方法个数和方法信息

*/

func TestStudentStruct(i interface{}) {
reflectValue := reflect.ValueOf(i)
// //获取字段值
// field := reflectValue.Field(0)
// fmt.Println("field", field)
// //获取长度
// // reflectValue.NumField
// num := reflectValue.NumField()
// fmt.Println("num=", num)
// //获取所有属性值
// for i := 0; i < num; i++ {
// fmt.Printf("弟%d字段值是:%v\n", i, reflectValue.Field(i))
// }

//修改变量的值 name改成 mike 当传入地址的时候上面需要注释,因为这个时候需要通过Elem方法调用后面的方法
reflectValue.Elem().Field(0).SetString("mike") //after change= {mike 22}

}

func main() {

//初始化结构体
stu := Student{
Name: "小红",
Age: 22,
}

fmt.Println("通过反射来操作结构体的属性和方法")

//反射修改变量的值需要传递地址
TestStudentStruct(&stu)

fmt.Println("after change=", stu)

}

posted @ 2023-11-20 18:34  北京小小鸟  阅读(73)  评论(0)    收藏  举报