日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語言 正文

golang中使用匿名結(jié)構(gòu)體的方法_Golang

作者:楊彥星 ? 更新時(shí)間: 2022-10-18 編程語言

在一些項(xiàng)目中, 我們會(huì)使用json 來將字符串轉(zhuǎn)為結(jié)構(gòu)體,但是很多時(shí)候,這種結(jié)構(gòu)體只會(huì)用一次,基本上只會(huì)用于反序列化, 對(duì)于這種只用到一次的結(jié)構(gòu)體, 我們可以使用匿名結(jié)構(gòu)體. 在gin 接收參數(shù)的時(shí)候會(huì)非常有用, 如我們將要接收的json 參數(shù)為

{
  "opt": "left", 
  "phoneinfo": [
    {"device_id": 64, "sn": "192.168.110.65:5555"},
    {"device_id": 68, "sn": "192.168.110.164:5555"}
  ]
}

當(dāng)我們嘗試使用?json.Unmarshal()?函數(shù)將json 字符串轉(zhuǎn)為go中的數(shù)據(jù)結(jié)構(gòu)時(shí),我們可以有以下幾種方式

轉(zhuǎn)化為map

map 結(jié)構(gòu)需要定義key 和value的類型, 對(duì)于key 好說, 可以都定義為string, 但是對(duì)于value, 從上面的json 結(jié)構(gòu)可以看出, 有字符串,也有整型,這種就不太好定義,誰知道未來會(huì)不會(huì)有新的類型,所以我們可以無腦的將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)體

還有一種方式是定義一個(gè)結(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)體

上面定義了兩個(gè)結(jié)構(gòu)體,但是很明顯,這兩個(gè)結(jié)構(gòu)體只在這里使用一次, 別的地方是不會(huì)再用得到的, 所以這時(shí)我們也可以使用匿名結(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 {}?來初始化一個(gè)匿名結(jié)構(gòu)體變量, 但是如果這種結(jié)構(gòu)需要在多處使用,那還是單獨(dú)定義一個(gè)具名結(jié)構(gòu)體比較好.

原文鏈接:https://www.yangyanxing.com/article/anonymous-struct-in-go.html

欄目分類
最近更新