如何将UTF8字符串转换为[]byte类型?

5

我想要将包含JSON的string进行解组, 但是Unmarshal函数需要一个[]byte作为输入。

我该如何将我的UTF8 string转换为[]byte


2
你可以使用[]byte(s) - Alexander Trakhimenok
1
已经在这里回答 - https://dev59.com/DWsz5IYBdhLWcg3wOlWh - Maciej Długoszek
2个回答

17

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

按照规范,可以使用简单的转换string转换为[]byte

与字符串类型的转换

[...]

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

所以你可以简单地这样做:

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

但是,string => []byte 的转换会复制字符串内容(因为 string 是不可变的,而 []byte 值不是),对于大型的 string 不够高效。相反地,您可以使用 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(),而无需先从中读取内容。


又一篇我引用的好文章。请参见 https://dev59.com/OVwZ5IYBdhLWcg3waPvX#62740786 - user12817546

1

只需在字符串上使用 []byte(s)。例如:

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    s := `{"test":"ok"}`
    var data map[string]interface{}
    if err := json.Unmarshal([]byte(s), &data); err != nil {
        panic(err)
    }
    fmt.Printf("json data: %v", data)
}

在游乐场上查看这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接