golang中使用匿名结构体的方法
作者:杨彦星 发布时间:2023-07-10 07:26:56
标签:golang,匿名,结构体
在一些项目中, 我们会使用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
0
投稿
猜你喜欢
- 现在我将清除页面缓存的一些方法总结如下:1、在Asp页面首部加入<% Response.Buffer = True
- 最近,在项目开发过程中,碰到了数据库死锁问题,在解决问题的过程中,笔者对MySQL InnoDB引擎锁机制的理解逐步加深。案例如下:在使用S
- 1. 反射简介1.1 反射是什么?Go语言提供了一种机制在运行时更新和检查变量的值、调用变量的方法和变量支持的内在操作,但是在编译时并不知道
- aspjpeg版本:v1.801 将pic.jpg打上logo.png,可根据图片大小对水印图做适当调整 &
- 我们在做表单的时候经常会使用到这样的结构:<fieldset> <lege
- 2008北京奥运会块到了,下面的js代码将告诉你,离奥运会开幕还要多少天!让我们一起迎接这美好的时刻。相关文章推荐:各种北京2008奥运会倒
- ajax 同步请求和异步请求的差异分析,需要的朋友可以参考下。代码一:Synchronize = function(url,param) {
- Sun Microsystems公司宣布,正式对外提供MySQL 5.1软件——这是全球最受欢迎的开
- XmlDocume
- 由于数据文件平时在数据库运行的时候处于使用状态,故当数据库处于打开状态时,管理员是无法重命名数据文件名字的。那么一定要更改这个数据文件的名字
- 格式为: SCRENC [/s] [/f] [/xl] [/l defLanguage ] [/e de
- 演示:<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//
- 网站 首页页面宽度 px Yahoo! 950 淘宝 950 MySpace 960 新浪 950 网易 960 Live Search 9
- 阅读上一篇:你是真正的用户体验设计者吗? Ⅲ交互系统设计者负责用户体验——不!那么什么是真正的交互呢?什么是交互式系统?你桌子上的杯子是交互
- 现在的垃圾留言越来越智能,并且从留言内容几乎看不出来是垃圾留言,而大量的垃圾留言会导致文章可读性下降,并可能会被搜索引擎惩罚,经过一段时间的
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 19 - TooltipsMootools 1.2
- 测试代码:输出简单的ul li1.asp代码如下:<% response.write "<ul>" r
- 在Linux下C连接MySQL出现问题如下:编译成功后,运行程序,出现./connect: error while loading shar
- javascript 代码实现vbscript中的trim、left、right等函数兼容IE,FireFox。<style>b
- Yahoo!的Exceptional Performance团队为改善Web性能带来最佳实践。他们为此进行了一系列的实验、开发了