golang中使用匿名結構體的方法
在一些項目中, 我們會使用json 來將字符串轉為結構體,但是很多時候,這種結構體隻會用一次,基本上隻會用於反序列化, 對於這種隻用到一次的結構體, 我們可以使用匿名結構體. 在gin 接收參數的時候會非常有用, 如我們將要接收的json 參數為
{ "opt": "left", "phoneinfo": [ {"device_id": 64, "sn": "192.168.110.65:5555"}, {"device_id": 68, "sn": "192.168.110.164:5555"} ] }
當我們嘗試使用 json.Unmarshal()
函數將json 字符串轉為go中的數據結構時,我們可以有以下幾種方式
轉化為map
map 結構需要定義key 和value的類型, 對於key 好說, 可以都定義為string, 但是對於value, 從上面的json 結構可以看出, 有字符串,也有整型,這種就不太好定義,誰知道未來會不會有新的類型,所以我們可以無腦的將json 轉化為 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) }
這種是可以轉換,但是如果要用到裡面的數據就比較麻煩, 需要將 interface{}
做類型轉換 如要獲取到opt 參數
opt := s["opt"].(string) fmt.Println(opt)
定義具名結構體
還有一種方式是定義一個結構體,用來接收參數 如想要接收上面的json 字符串, 可以定義下面的結構體
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 }
定義匿名結構體
上面定義瞭兩個結構體,但是很明顯,這兩個結構體隻在這裡使用一次, 別的地方是不會再用得到的, 所以這時我們也可以使用匿名結構體
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 {}
來初始化一個匿名結構體變量, 但是如果這種結構需要在多處使用,那還是單獨定義一個具名結構體比較好.
到此這篇關於golang中使用匿名結構體的文章就介紹到這瞭,更多相關golang匿名結構體內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Golang語言JSON解碼函數Unmarshal的使用
- golang中json小談之字符串轉浮點數的操作
- golang中json操作的完全指南
- 解決Golang json序列化字符串時多瞭\的情況
- GoLang sync.Pool簡介與用法