2

这篇博客的目的是介绍如何用反射对象修改时间变量的值。要达到上述目的,最基本的操作如下:

基本数据类型的修改

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


LiberHome
409 声望1.1k 粉丝

有问题 欢迎发邮件 📩 liberhome@163.com