golang中使用匿名結(jié)構(gòu)體的方法
在一些項(xiàng)目中, 我們會(huì)使用json 來(lái)將字符串轉(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的類(lèi)型, 對(duì)于key 好說(shuō), 可以都定義為string, 但是對(duì)于value, 從上面的json 結(jié)構(gòu)可以看出, 有字符串,也有整型,這種就不太好定義,誰(shuí)知道未來(lái)會(huì)不會(huì)有新的類(lèi)型,所以我們可以無(wú)腦的將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{} 做類(lèi)型轉(zhuǎn)換 如要獲取到opt 參數(shù)
opt := s["opt"].(string) fmt.Println(opt)
定義具名結(jié)構(gòu)體
還有一種方式是定義一個(gè)結(jié)構(gòu)體,用來(lái)接收參數(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)
}直接通過(guò) var 變量名 struct {} 來(lái)初始化一個(gè)匿名結(jié)構(gòu)體變量, 但是如果這種結(jié)構(gòu)需要在多處使用,那還是單獨(dú)定義一個(gè)具名結(jié)構(gòu)體比較好.
到此這篇關(guān)于golang中使用匿名結(jié)構(gòu)體的文章就介紹到這了,更多相關(guān)golang匿名結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
這些關(guān)于Go中interface{}的注意事項(xiàng)你都了解嗎
這篇文章主要為大家詳細(xì)介紹了學(xué)習(xí)Go語(yǔ)言時(shí)需要了解的interface{}注意事項(xiàng),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下2023-03-03
Apache?IoTDB開(kāi)發(fā)系統(tǒng)之Go原生接口方法
這篇文章主要為大家介紹了?Apache?IoTDB開(kāi)發(fā)系統(tǒng)之Go原生接口方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09
go web 預(yù)防跨站腳本的實(shí)現(xiàn)方式
這篇文章主要介紹了go web 預(yù)防跨站腳本的實(shí)現(xiàn)方式,文中給大家介紹XSS最佳的防護(hù)應(yīng)該注意哪些問(wèn)題,本文通過(guò)實(shí)例代碼講解的非常詳細(xì),需要的朋友可以參考下2021-06-06
解決golang結(jié)構(gòu)體tag編譯錯(cuò)誤的問(wèn)題
這篇文章主要介紹了解決golang結(jié)構(gòu)體tag編譯錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-05-05
Golang利用Template模板動(dòng)態(tài)生成文本
Go語(yǔ)言中的Go?Template是一種用于生成文本輸出的簡(jiǎn)單而強(qiáng)大的模板引擎,它提供了一種靈活的方式來(lái)生成各種格式的文本,下面我們就來(lái)看看具體如何使用Template實(shí)現(xiàn)動(dòng)態(tài)文本生成吧2023-09-09

