網(wǎng)站首頁(yè) 編程語言 正文
在一些項(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
相關(guān)推薦
- 2022-01-20 關(guān)于 Symbol() 能不能當(dāng)作 key值使用
- 2022-11-12 C語言數(shù)據(jù)結(jié)構(gòu)之單鏈表的查找和建立_C 語言
- 2022-10-30 Go中的錯(cuò)誤和異常處理最佳實(shí)踐方法_Golang
- 2022-06-16 .Net?Core解決WebAPI中返回時(shí)間格式帶T的問題_實(shí)用技巧
- 2022-08-10 C#對(duì)WPF數(shù)據(jù)綁定的菜單插入Seperator分隔_C#教程
- 2022-11-03 通過VS下載的NuGet包修改其下載存放路徑的操作方法_python
- 2022-09-07 Jquery實(shí)現(xiàn)異步上傳文件_jquery
- 2022-06-12 startup.bat啟動(dòng)Tomcat閃退問題原因及解決_Tomcat
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支