背景
笔者刚毕业没多久,也刚开始用GO没多久。可能还会踩一些只有菜鸟踩的坑,在这记录下,为了自己和看到的人不再踩同一样的坑。这次json.Unmarshal报错就是在开发公司业务中,明明定义了正确的结构体,但是json.Unmarshal一直报错的问题。
现象
报错信息:
json: Unmarshal(nil *Brand)]
解决
首先说明根因,json.Unmarshal在传入结构体指针时,不能够传入nil指针。
其实也很好理解,当传入nil指针的时候,都没有地址可以确定写入,自然会报错。当报这个错误的时候,大概率就应该检查自己定义变量的方式了。
我定义变量的方式是:
var brand *Brand
在这里,不得不佩服我,完美的避开了所有正确的定义方式,定义了一个nil结构体指针。这里,var声明一个空指针而没有赋值,即该指针没有任何指向。当指针没有指向的时候,不能对指针进行操作包括读取,否则会报空指针异常。
因此,从这里我又再去看了一下var,make和new三种不同的定义方式。
总结一下就是:
var用来声明一个变量,new和make用来进行内存分配。
make用来进行内建类型的内存分配,返回的是值。
new进行结构体等的内存分配,返回的是指针。
在刚刚这个情况下,我可以有以下选择:
var brand Brand
brand := new(Brand)
总结
希望这是一个好的开始,以后能够多写博客多记录,哪怕是菜鸡,坑才多了也能有成长,毕竟我才练习时长半年嘻嘻。