如果需要动态设置struct变量field的情况下, 可以利用reflect来完成。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
package main
import (
"fmt"
"reflect"
)
// 定义结构体Person
type Person struct {
Name string
Age int
}
func main() {
person := Person{}
fmt.Println(person) // 修改前 { 0}
pp := reflect.ValueOf(&person) // 取得struct变量的指针
field := pp.Elem().FieldByName("Name") //获取指定Field
field.SetString("gerrylon") // 设置值
field = pp.Elem().FieldByName("Age")
field.SetInt(26)
fmt.Println(person) // 修改后 {gerrylon 26}
}
|
事实上对于原始值也是一样的, 要利用指针, 因为golang默认都是传值, 示例如下:
1
2
3
4
5
6
|
var f float64 = 3.4
fmt.Println(f) // 3.4
p := reflect.ValueOf(&f) // 注意这里一定要是指针, 否则传递给ValueOf的是f的拷贝
v := p.Elem()
v.SetFloat(3.5)
fmt.Println(f) // 3.5
|
总结:
反射传入的应该是变量的指针
利用 FieldByName()方法可以设置struct的指定key的值, 非常强大。
补充:golang通过反射修改变量的值
看代码吧~
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
package main
import (
"fmt"
"reflect"
)
func reflectTest(str interface{}) {
fs := reflect.ValueOf(str)
fs.Elem().SetString("jack")
fmt.Printf("%v\n" ,fs.Elem())
}
func main(){
var str string = "tom"
reflectTest(&str)
fmt.Println(str)
}
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://gerrylon.blog.csdn.net/article/details/82966445