golang通過反射設(shè)置結(jié)構(gòu)體變量的值
如果需要動態(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}
}
事實上對于原始值也是一樣的, 要利用指針, 因為golang默認都是傳值, 示例如下:
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的值, 非常強大。
補充: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)
}
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。
相關(guān)文章
Golang實現(xiàn)Directional Channel(定向通道)
這篇文章主要介紹了Golang實現(xiàn)Directional Channel(定向通道),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02
Go 并發(fā)實現(xiàn)協(xié)程同步的多種解決方法
這篇文章主要介紹了Go 并發(fā)——實現(xiàn)協(xié)程同步的多種解決方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08
Bililive-go 實現(xiàn)直播自動監(jiān)控錄制功能
最近有直播錄制的需求,但是自己手動錄制太麻煩繁瑣,于是用了開源項目Bililive-go進行全自動監(jiān)控錄制,對Bililive-go 直播自動監(jiān)控錄制實現(xiàn)思路感興趣的朋友,一起看看吧2024-03-03
Go語言中使用flag包對命令行進行參數(shù)解析的方法
這篇文章主要介紹了Go語言中使用flag包對命令行進行參數(shù)解析的方法,文中舉了一個實現(xiàn)flag.Value接口來自定義flag的例子,需要的朋友可以參考下2016-04-04

