golang中使用匿名結(jié)構(gòu)體的方法
在一些項目中, 我們會使用json 來將字符串轉(zhuǎn)為結(jié)構(gòu)體,但是很多時候,這種結(jié)構(gòu)體只會用一次,基本上只會用于反序列化, 對于這種只用到一次的結(jié)構(gòu)體, 我們可以使用匿名結(jié)構(gòu)體. 在gin 接收參數(shù)的時候會非常有用, 如我們將要接收的json 參數(shù)為
{ "opt": "left", "phoneinfo": [ {"device_id": 64, "sn": "192.168.110.65:5555"}, {"device_id": 68, "sn": "192.168.110.164:5555"} ] }
當我們嘗試使用 json.Unmarshal()
函數(shù)將json 字符串轉(zhuǎn)為go中的數(shù)據(jù)結(jié)構(gòu)時,我們可以有以下幾種方式
轉(zhuǎn)化為map
map 結(jié)構(gòu)需要定義key 和value的類型, 對于key 好說, 可以都定義為string, 但是對于value, 從上面的json 結(jié)構(gòu)可以看出, 有字符串,也有整型,這種就不太好定義,誰知道未來會不會有新的類型,所以我們可以無腦的將json 轉(zhuǎn)化為 map[string]interface{}
import ( "encoding/json" "fmt" ) func main() { str := `{ "opt": "left", "phoneinfo": [ {"device_id": 64, "sn": "192.168.110.65:5555"}, {"device_id": 68, "sn": "192.168.110.164:5555"} ] }` var s map[string]interface{} json.Unmarshal([]byte(str), &s) fmt.Printf("%#v", s) }
這種是可以轉(zhuǎn)換,但是如果要用到里面的數(shù)據(jù)就比較麻煩, 需要將 interface{}
做類型轉(zhuǎn)換 如要獲取到opt 參數(shù)
opt := s["opt"].(string) fmt.Println(opt)
定義具名結(jié)構(gòu)體
還有一種方式是定義一個結(jié)構(gòu)體,用來接收參數(shù) 如想要接收上面的json 字符串, 可以定義下面的結(jié)構(gòu)體
package main import ( "encoding/json" "fmt" ) type phoneinfo struct { Device_id int `json:"device_id"` Sn string `json:"sn"` } type params struct { Opt string `json:"opt"` Phoneinfo []phoneinfo `json:"phoneinfo"` } func main() { str := `{ "opt": "left", "phoneinfo": [ {"device_id": 64, "sn": "192.168.110.65:5555"}, {"device_id": 68, "sn": "192.168.110.164:5555"} ] }` var s params json.Unmarshal([]byte(str), &s) fmt.Printf("%#v\n", s) fmt.Println(s.Opt) //left fmt.Println(s.Phoneinfo[0].Sn) //192.168.110.65:5555 }
定義匿名結(jié)構(gòu)體
上面定義了兩個結(jié)構(gòu)體,但是很明顯,這兩個結(jié)構(gòu)體只在這里使用一次, 別的地方是不會再用得到的, 所以這時我們也可以使用匿名結(jié)構(gòu)體
func main() { str := `{ "opt": "left", "phoneinfo": [ {"device_id": 64, "sn": "192.168.110.65:5555"}, {"device_id": 68, "sn": "192.168.110.164:5555"} ] }` var s struct { Opt string `json:"opt"` Phoneinfo []struct { Device_id int `json:"device_id"` Sn string `json:"sn"` } `json:"phoneinfo"` } json.Unmarshal([]byte(str), &s) fmt.Printf("%#v\n", s) fmt.Println(s.Opt) fmt.Println(s.Phoneinfo[0].Sn) }
直接通過 var 變量名 struct {}
來初始化一個匿名結(jié)構(gòu)體變量, 但是如果這種結(jié)構(gòu)需要在多處使用,那還是單獨定義一個具名結(jié)構(gòu)體比較好.
到此這篇關(guān)于golang中使用匿名結(jié)構(gòu)體的文章就介紹到這了,更多相關(guān)golang匿名結(jié)構(gòu)體內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go內(nèi)存隊列l(wèi)ist VS slice實現(xiàn)方式對比分析
這篇文章主要為大家介紹了go內(nèi)存隊列l(wèi)ist VS slice實現(xiàn)方式對比分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08詳解如何通過Go來操作Redis實現(xiàn)簡單的讀寫操作
作為最常用的分布式緩存中間件——Redis,了解運作原理和如何使用是十分有必要的,今天來學習如何通過Go來操作Redis實現(xiàn)基本的讀寫操作,需要的朋友可以參考下2023-09-09