菜鸟程序猿学习Go语言时遇到的一些坑
???
简单的来说就是序列化定义的结构体,在反序列化的时候,结构体 标识符 可以不一样(可以理解为结构体的名字),但是结构体的内部 字段/属性 要一致
举个例子:
结构体序列化之前
type Hero struct {
Name string `json:"hero_name"` //反射,Go中通过 对命名的首字母大写来确认公有
Age int
Skill string
}
func main() {
hero := Hero {
Name :"SuperMan ~",
Age : 1 ,
Skill : "镭射眼",
}
//将Hero 序列化
data, err := json.Marshal(&hero) //序列化函数
if err != nil {
fmt.Printf("序列号错误 err=%v\n", err)
}
//输出序列化后的结果
fmt.Printf("Hero序列化后=%v\n", string(data))
}
结果为:
终端显示 : {"Name":"SuperMan ~","Age" : 1 ,"Skill" : "镭射眼"}
结构体反序列化:
type ParallelUniverseHero struct {
Name string
Age int
Skill string
}
str := "{\"Name\":\"SuperMan ~\",\"Age\":1,\"Skill\":\"镭射眼\"}" //系统读取的字符串可以不用加“\”转译,手动输入的需要转译
//定义一个Monster实例
var PUhero Monster
err := json.Unmarshal([]byte(str), &PUhero) //反序列化函数
if err != nil {
fmt.Printf("unmarshal err=%v\n", err)
}
fmt.Printf("反序列化后 PUhero=%\n", PUhero)
结果为:
终端显示 : {"Name":"SuperMan ~","Age" : 1 ,"Skill" : "镭射眼"}
(比较懒就不截图了 =v= !)
从两段代码中可以看到结构体的标识符(名字),并不一样,但是仍然可以正常的获取输出。但是如果结构体的字段个数或内容不一致,就会出现异常结果,或为初始定义时的空内容或0或false。(这里不会报错!而且还可以执行通过,编辑器检查不出来,很坑!很有可能出现字段内容为空的问题。会正常显示内容,但是内容是错误的)
对于Map和Slice的反序列化,对类型上有严格的要求。下面我拿map举例,Slice是类似的。
代码:
序列化Map
func testmap() string {
//定义一个map
var batman map[string]interface{} //使用map时,需要先 make 在内存中开辟空间
batman = make(map[string]interface{})
batman["name"] = "BatMan"
batman["age"] = 30
batman["skill"] = "有钱!"
//将 batman 这个map进行序列化
data, err := json.Marshal(batman)
if err != nil {
fmt.Printf("序列化错误 err=%v\n", err)
}
//输出序列化后的结果
//fmt.Printf("batman 序列化后=%v\n", string(data))
}
得到的结果是:
控制台输出:batman 序列化后=map[skill:有钱! age:30 name:BatMan
反序列化Map:
str := testmap() //这里直接使用map的序列化中的Json字符串
//定义一个map
var a map[string]interface{}
//反序列化
//注意:反序列化map,不需要make,因为make操作被封装到 Unmarshal函数
err := json.Unmarshal([]byte(str), &a)
if err != nil {
fmt.Printf("unmarshal err=%v\n", err)
}
fmt.Printf("反序列化 batman的类型:%T", a)
fmt.Printf("反序列化后 batman=%v\n", a)
结果是:
控制台输出 batman 反序列化后=map[skill:有钱! age:30 name:BatMan]
如果map的类型不一样的话
str := "{\"skill\":\"有钱!\",\"age\":30,\"name\":\"BatMan\"}"
//定义一个map,这里类型为[byte],而不是之前的[string]
var a map[byte]interface{}
err := json.Unmarshal([]byte(str), &a)
if err != nil {
fmt.Printf("unmarshal err=%v\n", err)
}
fmt.Printf("反序列化 batman的类型:%T", a)
fmt.Printf("反序列化后 batman=%v\n", a)
结果就会出现:
unmarshal err=json: cannot unmarshal number skill into Go value of type uint8
反序列化 batman的类型:map[uint8]interface {}
反序列化后 batman=map[]
Slice报出的提示语和Map相同提示如下:
unmarshal err=json: cannot unmarshal number age into Go value of type uint8
反序列化后 slice=[map[] map[] map[] map[] map[]]
但仍然不会报错!!!可以执行通过!!!不过相比于结构体起码有个提示语。
未完待续…以后会陆续更新~~~
SparkSQL内置函数sparkSQL支持大量的常见函数,具体参考此文章https://www.iteblog.com/archives/2336.htmlSparkSQL的自定义函数(UDF)在Spark中,也支持Hive中的自定义函数。自定义函数大致可以分为三种:•UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等•U...
1. LinuxIO栈图文件系统 I/O 性能指标存储空间的使用情况,包括容量、使用量以及剩余空间等索引节点的使用情况,它也包括容量、使用量以及剩余量等缓存使用情况,包括页缓存、目录项缓存、索引节点缓存以及各个具体文件系统(如 ext4、XFS 等)的缓存结合实际文件的读写情况,比如,结合文件大小、文件数量、I/O 类型等考虑 IOPS(包括 r/s 和 w/s)、响应时间(延迟)以及吞吐量(B/s)等。磁盘 I/O 性能指标使用率,是指磁盘忙处理 I/O 请求的百分比。过高的使用率(
gpasswd用户组管理员是让某个用户组具有一个管理员,这个用户组管理员可以管理哪些帐号可以加入/移出该用户组语法:#关于系统管理员(root)做的动作:gpasswd groupnamegpasswd [-A user1,....] [-M user3...] groupnamegpasswd [-rR] groupname参数:若没有任何参数,表示给予groupname ...
今天提交苹果审核时,突然报错,如下:ERROR ITMS-90062: "This bundle is invalid. The value for key CFBundleShortVersionString [1.2.0] in the Info.plist file must contain a higher version than that of the previously app
在网上找C++编译工具软件,找到了DevC++,它有多个版本,包括5.10,5.11 。但是开始它的菜单显示不清楚,因此卸载了它。后来又重装了几次,都是同样都问题。后来修改了屏幕分辨率,再安装它,它的菜单显示变好了很多。因此就把它保留了下来。在win10下,它的界面图1所示。但是最近将电脑操作系统恢复出厂设置以后,再装上该软件,界面变得不清晰了,见图2 .因此这个问题的原因还是在软件上,可能是操作...
单片机是不是嵌入式呢,老生常谈了///插播一条:我自己在今年年初录制了一套还比较系统的入门单片机教程,想要的同学找我拿就行了免費的,私信我就可以哦~点我头像黑色字体加我地球呺也能领取哦。最近比较闲,带做毕设,带学生参加省级或以上比赛///01问题很多同学一直在纠结:我是学单片机呢还是学嵌入式呢?还有人说单片机也是嵌入式,到底对不对?嵌入式是不是就是linux?今天咱们说说这个问题。02什么是单片机单片机的本质是一种计算机。那什么是计算机?计算机就是一个硬件上包含了CPU、内存和一定外设(I
以前在Android5.0上直接这样调用是没问题.s_handle = dlopen("/system/lib/libHWMI.so", RTLD_NOW);但是项目移植到Android 8.0上就报了如上错误.说下解决方法,想知道原理的移步:http://jackwish.net/namespace-based-dynamic-linking.html想看代码的话Android8...
(1)受控组件在使用表单来收集用户输入时,例如等元素都要绑定一个change事件,当表单的状态发生变化,就会触发onChange事件,更新组件的state。这种组件在React中被称为受控组件,在受控组件中,组件渲染出的状态与它的value或checked属性相对应,react通过这种方式消除了组件的局部状态,使整个状态可控。react官方推荐使用受控表单组件。可以通过初始state中设置表单的默认值每当表单的值发生变化时,调用onChange事件处理器。
链接Bracket Sequence题解 只有一种括号,所以很容易用前缀和判断是否合法,方法就是把左括号看作1,右括号看作-1,这样对于一段区间[l,r][l,r][l,r]来说,定义前缀和S[i]=∑j=0ia[l+i]S[i] = \sum_{j = 0}^{i}a[l + i]S[i]=∑j=0ia[l+i],只要满足S[r−l+1]=0,S[i]≥0(i=0,1,...r−...
转自wufawei的博客当你的应用提交到App Store或者各个渠道之后,请问你多久会拿到crash文件?你如何分析crash文件的呢? 上传crash文件你的应用应当有模块能够在应用程序crash的时候上传crash信息。 要么通过用户反馈拿到crash文件,要么借助自己或第3方的crash上传模块拿到crash文件。 今天要分析的场景是你拿到用户的.crash文件之后,如何符合化crash文...
1. 说明由于.Net Micro Framework的USB驱动架构中,没有为Mass Storage功能提供原生支持,所以除了要编写Mass Storage主体代码外,还需要在原有的USB驱动中添加部分枚举代码。其实从结构上来说,该部分代码应该添加在PAL层,不过考虑到这层代码为.Net Micro Framework Poring Kit Rtm 3.0标准代码,所以把这部分代码添加到我
EasyCVR视频结构化平台支持的协议广泛,其中就包括GB28181协议及海康摄像头常见的Ehome协议。有的项目现场将硬盘录像机通过GB28181协议接入到EasyCVR平台后,直播预览正常,但是播放设备录像时则出现无法加载画面的情况。直播预览画面正常:播放设备录像一直加载:因此我们对系统进行wireshark抓包,抓包文件如下:通过以上信息,可以看出GB28181点播设备录像的SIP流程正常,收流TCP链接成功建立,问题在于视频流的发送者(NVR设备)没有发送视频流数据。