将[]字符串转换为[]字节

jim*_*pez 14 go

我希望将字符串数组转换为GO中的字节数组,以便将其写入磁盘.将字符串数组([]string)编码和解码为字节数组([]byte)的最佳解决方案是什么?

我想要迭代字符串数组两次,第一次获得字节数组所需的实际大小,然后第二次[]byte(str)为每个元素写入长度和实际字符串().

解决方案必须能够以另一种方式转换它; 从a []byte到a []string.

Ste*_*erg 23

让我们忽略这是Go的观点.您需要的第一件事是编组格式的序列化格式[]string.

这里有很多选择.您可以构建自己的或使用库.我将假设您不想构建自己的并跳转到序列化格式支持.

在所有示例中,数据是[]string和fp是您正在读/写的文件.错误被忽略,检查函数的返回以处理错误.

凝块

Gob是一种仅限二进制格式.随着字符串数量的增加,它应该是相对空间有效的.

enc := gob.NewEncoder(fp)
enc.Encode(data)
Run Code Online (Sandbox Code Playgroud)

阅读也很简单

var data []string
dec := gob.NewDecoder(fp)
dec.Decode(&data)
Run Code Online (Sandbox Code Playgroud)

Gob很简单而且非常重要.但是,该格式只能与其他Go代码一起使用.

JSON

接下来是json.Json是一种几乎无处不在的格式.这种格式同样易于使用.

enc := json.NewEncoder(fp)
enc.Encode(data)
Run Code Online (Sandbox Code Playgroud)

阅读:

var data []string
dec := json.NewDecoder(fp)
dec.Decode(&data)
Run Code Online (Sandbox Code Playgroud)

XML

XML是另一种常见格式.但是,它具有相当高的开销,并且不易使用.虽然你可以像gob和json那样做,但正确的xml需要一个root标签.在这种情况下,我们使用根标签"Strings",每个字符串都包含在"S"标签中.

type Strings struct {
    S []string
}

enc := xml.NewEncoder(fp)
enc.Encode(Strings{data})

var x Strings
dec := xml.NewDecoder(fp)
dec.Decode(&x)
data := x.S
Run Code Online (Sandbox Code Playgroud)

CSV

CSV与其他CSV不同.您有两个选项,使用一行记录n行或n行记录1行.以下示例使用n条记录.如果我使用一条记录,那将会很无聊.它看起来太像其他人了.CSV只能包含字符串.

enc := csv.NewWriter(fp)
for _, v := range data {
    enc.Write([]string{v})
}
enc.Flush()
Run Code Online (Sandbox Code Playgroud)

阅读:

var err error
var data string
dec := csv.NewReader(fp)
for err == nil {        // reading ends when an error is reached (perhaps io.EOF)
    var s []string

    s, err = dec.Read()
    if len(s) > 0 {
        data = append(data, s[0])
    }
}
Run Code Online (Sandbox Code Playgroud)

您使用哪种格式是首选项.我还没有提到许多其他可能的编码.例如,有一个名为bencode的外部库.我个人不喜欢bencode,但它有效.它与bittorrent元数据文件使用的编码相同.

如果你想自己编码,编码/二进制是一个很好的起点.这将允许您使最紧凑的文件成为可能,但我几乎不值得努力.


Jer*_*all 9

gob包将为你做这个http://godoc.org/encoding/gob

http://play.golang.org/p/e0FEZm-qiS一起玩的示例

相同的源代码如下.

package main

import (
    "bytes"
    "encoding/gob"
    "fmt"
)

func main() {
    // store to byte array
    strs := []string{"foo", "bar"}
    buf := &bytes.Buffer{}
    gob.NewEncoder(buf).Encode(strs)
    bs := buf.Bytes()
    fmt.Printf("%q", bs)

    // Decode it back
    strs2 := []string{}
    gob.NewDecoder(buf).Decode(&strs2)
    fmt.Printf("%v", strs2)
}
Run Code Online (Sandbox Code Playgroud)