这篇博客的目的是介绍如何用反射对象修改时间变量的值。要达到上述目的,最基本的操作如下:
基本数据类型的修改
package main
import (
"fmt"
"reflect"
)
func main() {
var num float64 = 3.14
fmt.Println("num is : ", num)
//下面操作指针获取num地址,记得加上&取地址
pointer := reflect.ValueOf(&num)
newValue := pointer.Elem()
fmt.Println("type: ", newValue.Type())
fmt.Println("can set or not:", newValue.CanSet())
//重新赋值
newValue.SetFloat(6.28)
fmt.Println(num)
}
运行结果如下:
num is : 3.14
type: float64
can set or not: true
6.28
结构体内的数值修改
本质和上面一样还是操作数值对应的指针地址。
先看一下怎么获取相感应的值,代码如下:
package main
import "fmt"
type Student struct {
Name string
Age int
School string
}
func main() {
s1 := Student{"shilingfly", 18, "TsingHua"}
fmt.Printf("%T\n", s1)
p1 := &s1
fmt.Println(p1.Name)
}
运行结果如下:
main.Student
shilingfly
然后看一下,如何修改相应字段的值,代码如下:
package main
import (
"fmt"
"reflect"
)
type Student struct {
Name string
Age int
School string
}
func main() {
s1 := Student{"shilingfly", 18, "TsingHua"}
fmt.Printf("%T\n", s1)
p1 := &s1
fmt.Println(p1.Name)
//改变数值
value := reflect.ValueOf(&s1)
//看一下是不是reflect的指针类型
if value.Kind() == reflect.Ptr {
newValue := value.Elem()
fmt.Println("can set or not: ", newValue.CanSet())
//在这里一项一项的修改
f1 := newValue.FieldByName("Name")
f1.SetString("Lisome")
f2 := newValue.FieldByName("Age")
f2.SetInt(17)
f3 := newValue.FieldByName("School")
f3.SetString("MIT")
fmt.Println(s1)
}
}
运行结果如下:
main.Student
shilingfly
can set or not: true
{Lisome 17 MIT}
参考:bilibili
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。