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

时间:2017-01-04 09:49:44

标签: json string go type-conversion slice

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

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

2 个答案:

答案 0 :(得分:10)

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

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

  

来自字符串类型的转化

     

[...]

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

所以你可以这样做:

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

但是,string => []byte转换会生成字符串内容的副本(因为string s是不可变的,而[]byte值不是),并且在大的情况下{ {1}}它效率不高。相反,您可以使用io.Reader创建strings.NewReader(),该json.NewDecoder()将从传递的string中读取,而不会复制它。您可以使用Decoder.Decode()方法将此string传递给Go Playground并解组:

io.Reader

输出(在json.Unmarshal()上尝试):

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

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

注意:调用map[somekey:somevalue] <nil> strings.NewReader()会产生一些开销,因此如果您使用的是小型JSON文本,则可以安全地将其转换为json.NewDecoder()并使用{{3} },它不会慢:

[]byte

输出是一样的。请在Go Playground上尝试此操作。

注意:如果您通过阅读一些s := `{"somekey":"somevalue"}` var result interface{} err := json.Unmarshal([]byte(s), &result) fmt.Println(result, err) (例如文件或网络连接)获得JSON输入string,则可以直接将io.Reader传递给{{1无需先读取内容。

答案 1 :(得分: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)
}

在操场here上查看。