一尘不染

如何将utf8字符串转换为[] byte?

go

我想解组string包含JSON的a,但是该Unmarshal函数将a []byte作为输入。

如何将UTF8转换string[]byte


阅读 282

收藏
2020-07-02

共1个答案

一尘不染

这个问题可能是如何将字符串分配给bytes数组的重复,但是仍然有答案,因为有更好的替代解决方案:

从转换string[]byte由该规范允许的,使用一个简单的转换

字符串类型之间的转换

[…]

  1. 将字符串类型的值转换为字节片的类型会产生一个片,其连续元素是字符串的字节。

因此,您可以简单地执行以下操作:

s := "some text"
b := []byte(s) // b is of type []byte

但是,该string => []byte转换会复制字符串内容(它必须复制,因为strings是不可变的,而[]byte值不是固定的),并且在strings
大的情况下效率不高。相反,您可以创建一个io.Reader使用方法strings.NewReader(),该方法将从传递的内容中读取内容,而string无需进行复制。您可以使用以下方法将此传递io.Readerjson.NewDecoder()并解组Decoder.Decode()

s := `{"somekey":"somevalue"}`

var result interface{}
err := json.NewDecoder(strings.NewReader(s)).Decode(&result)
fmt.Println(result, err)

输出(在Go Playground上尝试):

map[somekey:somevalue] <nil>

注意:调用strings.NewReader()json.NewDecoder()确实有一些开销,因此,如果您使用的是小型JSON文本,则可以安全地将其转换为[]byte和使用json.Unmarshal(),它不会变慢:

s := `{"somekey":"somevalue"}`

var result interface{}
err := json.Unmarshal([]byte(s), &result)
fmt.Println(result, err)

输出是相同的。在Go Playground上尝试一下。

注意:如果要string通过读取一些内容io.Reader(例如文件或网络连接)来获取JSON输入,则可以将其直接传递io.Readerjson.NewDecoder(),而不必先从中读取内容。

2020-07-02