为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在解组 JSON 时字符串和 []bytes 的处理方式不同?

为什么在解组 JSON 时字符串和 []bytes 的处理方式不同?

Go
牛魔王的故事 2021-09-13 14:56:33
我从阅读文档中了解到,string它本质上是不可变的[]byte,并且可以轻松地在两者之间进行转换。然而,当从 JSON 解组时,这似乎不是真的。以下面的示例程序为例:package mainimport (    "encoding/json"    "fmt")type STHRaw struct {    Hash []byte `json:"hash"`}type STHString struct {    Hash string `json:"hash"`}func main() {    bytes := []byte(`{"hash": "nuyHN9wx4lZL2L3Ir3dhZpmggTQEIHEZcC3DUNCtQsk="}`)    stringHead := new(STHString)    if err := json.Unmarshal(bytes, &stringHead); err != nil {        return    }    rawHead := new(STHRaw)    if err := json.Unmarshal(bytes, &rawHead); err != nil {        return    }    fmt.Printf("String:\t\t%x\n", stringHead.Hash)    fmt.Printf("Raw:\t\t%x\n", rawHead.Hash)    fmt.Printf("Raw to string:\t%x\n", string(rawHead.Hash[:]))}这给出了以下输出:String:         6e7579484e397778346c5a4c324c3349723364685a706d67675451454948455a63433344554e437451736b3dRaw:            9eec8737dc31e2564bd8bdc8af77616699a0813404207119702dc350d0ad42c9Raw to string:  9eec8737dc31e2564bd8bdc8af77616699a0813404207119702dc350d0ad42c9 相反,我希望每次都能收到相同的价值。有什么不同?
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

encoding/json包的设计者决定应用程序必须在string值中提供有效的 UTF-8 文本,并且应用程序可以在值中放置任意字节序列[]byte。包 base64 对[]byte值进行编码以确保生成的字符串是有效的 UTF-8。

Marshal 函数文档中[]byte描述了值的编码。

这个决定不是由 Go 语言的设计决定的。该string类型可以包含任意字节序列。该[]byte类型可以包含有效的 UTF-8 文本。

设计者可以在字段标签中使用一个标志来指示应该对 astring[]byte值进行编码以及使用哪个编码器,但这不是他们所做的。


查看完整回答
反对 回复 2021-09-13
  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信