我从阅读文档中了解到,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
值进行编码以及使用哪个编码器,但这不是他们所做的。
- 1 回答
- 0 关注
- 187 浏览
添加回答
举报
0/150
提交
取消