網站首頁 編程語言 正文
在一些項目中, 我們會使用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 {}
?來初始化一個匿名結構體變量, 但是如果這種結構需要在多處使用,那還是單獨定義一個具名結構體比較好.
原文鏈接:https://www.yangyanxing.com/article/anonymous-struct-in-go.html
相關推薦
- 2022-03-15 el-form-item prop屬性動態綁定不生效
- 2022-03-25 ASP.NET?Core實時庫SignalR簡介及使用_實用技巧
- 2022-06-27 服務器端如何開啟GZIP壓縮功能(Apache、IIS、Nginx)_Linux
- 2023-12-14 【datetime模塊】將時間加一秒或者減一秒
- 2022-11-20 C#?崩潰異常中研究頁堆布局的詳細過程_C#教程
- 2022-07-27 Python中的collections集合與typing數據類型模塊_python
- 2022-09-02 C#實現裝飾器模式_C#教程
- 2023-03-05 so加載Linker跟NameSpace機制詳解_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支