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 的string與[]byte轉(zhuǎn)換方式
這篇文章主要介紹了golang 的string與[]byte轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04
go?zero微服務(wù)實戰(zhàn)處理每秒上萬次的下單請求
這篇文章主要為大家介紹了go?zero微服務(wù)實戰(zhàn)處理每秒上萬次的下單請求示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07
Golang基于epoll實現(xiàn)最簡單網(wǎng)絡(luò)通信框架
這篇文章主要為大家詳細介紹了Golang如何基于epoll實現(xiàn)最簡單網(wǎng)絡(luò)通信框架,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)2023-06-06
Golang微服務(wù)框架Kratos實現(xiàn)Kafka消息隊列的方法
消息隊列是大型分布式系統(tǒng)不可缺少的中間件,也是高并發(fā)系統(tǒng)的基石中間件,所以掌握好消息隊列MQ就變得極其重要,在本文當中,您將了解到:什么是消息隊列?什么是Kafka?怎樣在微服務(wù)框架Kratos當中應(yīng)用Kafka進行業(yè)務(wù)開發(fā),需要的朋友可以參考下2023-09-09

