一个引号引发的惨案---string转byte[]

背景

客户端通过https请求访问服务端,校验服务端body返回值必须 =="OK",满足=="OK"业务能正常运行,否则异常
server端:

b, _ := json.Marshal("OK")
c.Ctx.Output.Body(b)

client端:

respBody, _ := ioutil.ReadAll(resp.Body)
content:=string(respBody)
if content == "OK" {
    ... //success
}

调试中发现死活进不到content == "OK"的判断,将content的值print出来也为"OK",但就是进不到相等的判断分支,导致业务一直异常,摸索半天后发现是string和byte[]转换的问题,后将server端修改如下,终于运行正常

var bytesOK = []byte("OK")
c.Ctx.Output.Body(bytesOK)

结论

string和byte[] 转换,需要匹配

  • Marshal 匹配 Unmarshal
  • []byte("OK") 匹配 string(bytesOK)
  • string 转为byte[],Marshal 会比 []byte("OK") 方式前后各多一个 "(ASCII 34)

测试demo源码:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    var bytesOK = []byte("OK")
    marshalBytesOK, _ := json.Marshal("OK")

    fmt.Println("bytesOK:", bytesOK)
    fmt.Println("marshalBytesOK:", marshalBytesOK)

    ok1 := string(bytesOK)
    fmt.Println("ok1:", ok1)
    fmt.Println("is ok1 == OK:", ok1 == "OK")

    ok2 := string(marshalBytesOK)
    fmt.Println("ok2:", ok2)
    fmt.Println("is ok2 == OK:", ok2 == "OK")

    var ok3 string
    json.Unmarshal(marshalBytesOK, &ok3)
    fmt.Println("ok3:", ok3)
    fmt.Println("is ok3 == OK:", ok3 == "OK")

}

输出如下:

bytesOK: [79 75]
marshalBytesOK: [34 79 75 34]
ok1: OK
is ok1 == OK: true
ok2: "OK"
is ok2 == OK: false
ok3: OK
is ok3 == OK: true
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,164评论 18 399
  • 转自:http://blog.csdn.net/kesonyk/article/details/50924489 ...
    晴天哥_王志阅读 25,249评论 2 38
  • 一. Java基础部分.................................................
    wy_sure阅读 9,291评论 0 11
  • 小时候坐在爸爸的二八自行车横梁上,去的最远的距离是县城的一端到另外一端,那时的马路感觉很宽,人们都走的很慢...
    待在竹亭落阅读 1,616评论 0 0

友情链接更多精彩内容