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)
}
浙公网安备 33010602011771号