这个问题可能与How to assign string to bytes array 重复,但仍然回答它,因为有更好的替代解决方案:
规范允许使用简单的conversion 从string 转换为[]byte:
字符串类型的转换
[...]
- 将字符串类型的值转换为字节类型的切片会产生一个切片,其连续元素是字符串的字节。
所以你可以简单地做:
s := "some text"
b := []byte(s) // b is of type []byte
但是,string => []byte 转换会复制字符串内容(它必须这样做,因为 strings 是不可变的,而 []byte 值不是),如果strings 很大,则效率不高.相反,您可以使用strings.NewReader() 创建一个io.Reader,它将从传递的string 中读取而不复制它。您可以将此io.Reader 传递给json.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 上试试这个。
注意:如果您通过读取一些 io.Reader(例如文件或网络连接)来获取 JSON 输入 string,则可以直接将 io.Reader 传递给 json.NewDecoder(),而无需阅读首先是它的内容。