如果需要?jiǎng)討B(tài)設(shè)置struct變量field的情況下, 可以利用reflect來完成。
代碼如下:
package main
import (
"fmt"
"reflect"
)
// 定義結(jié)構(gòu)體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") // 設(shè)置值
field = pp.Elem().FieldByName("Age")
field.SetInt(26)
fmt.Println(person) // 修改后 {gerrylon 26}
}
事實(shí)上對(duì)于原始值也是一樣的, 要利用指針, 因?yàn)間olang默認(rèn)都是傳值, 示例如下:
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
總結(jié):
反射傳入的應(yīng)該是變量的指針
利用 FieldByName()方法可以設(shè)置struct的指定key的值, 非常強(qiáng)大。
補(bǔ)充:golang通過反射修改變量的值
看代碼吧~
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)
}
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。
您可能感興趣的文章:- go語言 全局變量和局部變量實(shí)例
- golang 在windows中設(shè)置環(huán)境變量的操作
- 詳解Go語言變量作用域
- 關(guān)于Golang變量初始化/類型推斷/短聲明的問題
- 淺談golang并發(fā)操作變量安全的問題
- go語言的初始化順序,包,變量,init詳解
- 解決golang 關(guān)于全局變量的坑