经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
golang中使用匿名结构体的方法
来源:jb51  时间:2022/8/23 9:26:29  对本文有异议

在一些项目中, 我们会使用json 来将字符串转为结构体,但是很多时候,这种结构体只会用一次,基本上只会用于反序列化, 对于这种只用到一次的结构体, 我们可以使用匿名结构体. 在gin 接收参数的时候会非常有用, 如我们将要接收的json 参数为

  1. {
  2. "opt": "left",
  3. "phoneinfo": [
  4. {"device_id": 64, "sn": "192.168.110.65:5555"},
  5. {"device_id": 68, "sn": "192.168.110.164:5555"}
  6. ]
  7. }

当我们尝试使用 json.Unmarshal() 函数将json 字符串转为go中的数据结构时,我们可以有以下几种方式

转化为map

map 结构需要定义key 和value的类型, 对于key 好说, 可以都定义为string, 但是对于value, 从上面的json 结构可以看出, 有字符串,也有整型,这种就不太好定义,谁知道未来会不会有新的类型,所以我们可以无脑的将json 转化为 map[string]interface{}

  1. import (
  2. "encoding/json"
  3. "fmt"
  4. )
  5.  
  6. func main() {
  7. str := `{
  8. "opt": "left",
  9. "phoneinfo": [
  10. {"device_id": 64, "sn": "192.168.110.65:5555"},
  11. {"device_id": 68, "sn": "192.168.110.164:5555"}
  12. ]
  13. }`
  14. var s map[string]interface{}
  15. json.Unmarshal([]byte(str), &s)
  16. fmt.Printf("%#v", s)
  17. }

这种是可以转换,但是如果要用到里面的数据就比较麻烦, 需要将 interface{} 做类型转换 如要获取到opt 参数

  1. opt := s["opt"].(string)
  2. fmt.Println(opt)

定义具名结构体

还有一种方式是定义一个结构体,用来接收参数 如想要接收上面的json 字符串, 可以定义下面的结构体

  1. package main
  2.  
  3. import (
  4. "encoding/json"
  5. "fmt"
  6. )
  7.  
  8. type phoneinfo struct {
  9. Device_id int `json:"device_id"`
  10. Sn string `json:"sn"`
  11. }
  12.  
  13. type params struct {
  14. Opt string `json:"opt"`
  15. Phoneinfo []phoneinfo `json:"phoneinfo"`
  16. }
  17.  
  18. func main() {
  19. str := `{
  20. "opt": "left",
  21. "phoneinfo": [
  22. {"device_id": 64, "sn": "192.168.110.65:5555"},
  23. {"device_id": 68, "sn": "192.168.110.164:5555"}
  24. ]
  25. }`
  26. var s params
  27. json.Unmarshal([]byte(str), &s)
  28. fmt.Printf("%#v\n", s)
  29. fmt.Println(s.Opt) //left
  30. fmt.Println(s.Phoneinfo[0].Sn) //192.168.110.65:5555
  31. }

定义匿名结构体

上面定义了两个结构体,但是很明显,这两个结构体只在这里使用一次, 别的地方是不会再用得到的, 所以这时我们也可以使用匿名结构体

  1. func main() {
  2. str := `{
  3. "opt": "left",
  4. "phoneinfo": [
  5. {"device_id": 64, "sn": "192.168.110.65:5555"},
  6. {"device_id": 68, "sn": "192.168.110.164:5555"}
  7. ]
  8. }`
  9.  
  10. var s struct {
  11. Opt string `json:"opt"`
  12. Phoneinfo []struct {
  13. Device_id int `json:"device_id"`
  14. Sn string `json:"sn"`
  15. } `json:"phoneinfo"`
  16. }
  17. json.Unmarshal([]byte(str), &s)
  18. fmt.Printf("%#v\n", s)
  19. fmt.Println(s.Opt)
  20. fmt.Println(s.Phoneinfo[0].Sn)
  21.  
  22. }

直接通过 var 变量名 struct {} 来初始化一个匿名结构体变量, 但是如果这种结构需要在多处使用,那还是单独定义一个具名结构体比较好.

到此这篇关于golang中使用匿名结构体的文章就介绍到这了,更多相关golang匿名结构体内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号