PHP中可变变量在Golang中的一个实践 (reflect) 反射

By.chen
官方文档说明

关键代码 For Golang

import (
    "fmt"
    "reflect"
)

type NewCat struct {
    Name string
    Age int64
}

func main() {
    cat := NewCat{
        Name:"小花",
        Age:12,
    }
    // 假设这是一个 被传入的变量
    DiyName := "Name"
    // 利用反射获取Value
    rVal := reflect.ValueOf(&cat)
    rElem := rVal.Elem()
    rElem.FieldByName(DiyName).SetString("abc")
    fmt.Println(rElem.FieldByName(DiyName))
    fmt.Println(cat)
}

Res:

abc
{abc 12}

PHP 的实例

class Car {
    public name
    public function setValue($key,$value){
        return (new self())->$key = $value
    }
}

完整Golang实例

package main

import (
    "fmt"
    "reflect"
)

type NewCat struct {
    Name string
    Age int64
}

// SetVale
func (Cat *NewCat)SetVale(key string,value interface{}) (bool) {
    ok := true
    // 获取映射Value实例
    rVal := reflect.ValueOf(Cat)
    // 转指针操作
    rElem := rVal.Elem()
    // 获取需要修改的值相关实例
    waitModify := rElem.FieldByName(key)
    // 判断类型是否符合 如果符合
    if waitModify.Type().String() != reflect.TypeOf(value).String(){
        ok = false
        return ok
    }
    // 从Param中的interface取回需要改变值的实例
    rValue := reflect.ValueOf(value)
    waitModify.Set(rValue);
    return ok
}

func main() {
    cat := NewCat{
        Name:"小花",
        Age:12,
    }
    var Age int64 = 1 ;
    ok := cat.SetVale("Age",Age);
    fmt.Println(ok,cat)

}

实例图片