【问题标题】:How to convert utf8 string to []byte?如何将 utf8 字符串转换为 [] 字节?
【发布时间】:2017-05-18 13:30:33
【问题描述】:

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

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

【问题讨论】:

标签: json string go type-conversion slice


【解决方案1】:

这个问题可能与How to assign string to bytes array 重复,但仍然回答它,因为有更好的替代解决方案:

规范允许使用简单的conversion 从string 转换为[]byte:

字符串类型的转换

[...]

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

所以你可以简单地做:

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(),而无需阅读首先是它的内容。

【讨论】:

【解决方案2】:

只需在字符串上使用 []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)
}

在操场上看看here。

【讨论】:

    猜你喜欢
    • 2012-07-17
    • 2013-09-14
    • 2011-01-18
    • 2012-02-01
    • 2014-01-29
    • 1970-01-01
    • 2013-09-12
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多