GO-从json.Unmarshal报错中学到的两三点

164 阅读1分钟

背景

          笔者刚毕业没多久,也刚开始用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)

总结

           希望这是一个好的开始,以后能够多写博客多记录,哪怕是菜鸡,坑才多了也能有成长,毕竟我才练习时长半年嘻嘻。