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!

推薦閱讀: