go学习笔记(6)

昨天在测试一个小游戏登录模块功能的时候,编写一个json绑定的映射。一般在反序列化的时候会加上错误判断这也变成了习惯性的动作。但随后发现对这种判断还存在一些误解的地方。

看以下的代码说明。

package main

import (
    "fmt"
     "encoding/json"
)

type LoginVo struct{
    Openid string `json:"openid"` 
    InviteId int `json:"inviteid"`
}

func main() {
   fmt.Println("Hello, World!")
    var jsonStr = []byte(`{"openid":"asdasa","inviteid":0}`)
   var loginvo LoginVo
   err := json.Unmarshal(jsonStr,&loginvo)
   if err!=nil{
       fmt.Println("error:",err)
    }

    fmt.Printf("%+v",loginvo)
}

//以下是输出结果

Hello, World!
{Openid:asdasa InviteId:0}

正常情况下,这个绑定的结果和预期符合。LoginVo的值通过序列化赋值进来。

但随后因为测试日志功能,故意把json的一段代码字段调整。将原先的openid值更改一下。

    var jsonStr = []byte(`{"openid2":"asdasa","inviteid2":0}`)

测试的结果如下:

Hello, World!
{Openid: InviteId:0}

代码依旧可以通过,但并没有发生抛出错误。这个时候就觉得奇怪

继续把json的字符串调整非法json结构的时候,故意不加逗号

var jsonStr = []byte(`{"openid2":"asdasa""inviteid2":0}`)

编译后,会输出日志错误

Hello, World!
error: invalid character '"' after object key:value pair
{Openid: InviteId:0}

实际上,通过以上测试,一直误以为json.Unmarshal 操作的时候,将结构体loginVo映射赋值过如果不成功会抛出出错,事实上并不是。正常的json字符串,通过反序列化后依旧可以不抛出错误,只是说没有正常赋值给需要的结构体。

 err := json.Unmarshal(jsonStr,&loginvo)

最后想当然以为通过序列化可以判断这个值是否有效,看来还要判断一下这个结构体的值是否为空才能判断。

package main

import (
    "fmt"
     "encoding/json"
)

type LoginVo struct{
    Openid string `json:"openid"` 
    InviteId int `json:"inviteid"`
}

func main() {
   fmt.Println("Hello, World!")
    var jsonStr = []byte(`{"openid2":"asdasa","inviteid2":0}`)
   var loginvo LoginVo
   err := json.Unmarshal(jsonStr,&loginvo)
   if err!=nil{
       fmt.Println("error:",err)
    }
    if loginvo.Openid ==""{
         fmt.Println("error:Openid 不能为空",)
    }

    fmt.Printf("%+v",loginvo)
}

不知道还有没有存在其他的坑呢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值