在golang中将[] []字节转换为[]字符串的最有效方法

时间:2017-06-01 07:32:31

标签: go

要将[][]byte转换为[]string,我会这样做

data, err := ioutil.ReadFile("test.txt")
if err != nil {
    return nil, err
}

db := bytes.Split(data, []uint8("\n"))

// Convert [][]byte to []string
s := make([]string, len(db))
for i, val := range db {
    s[i] = string(val)
}
fmt.Printf("%v", s)

我是golang的新手,我不确定这是最有效的方法。

2 个答案:

答案 0 :(得分:2)

最有效的方法是删除此步骤:db := bytes.Split(data, []uint8("\n"))而是迭代data,如下所示:

func main() {
    data, _ := ioutil.ReadFile("test.txt")

    s := make([]string, 0)
    start := 0
    for i := range data {
        if data[i] == '\n' {
            elem := string(data[start : i-1])
            s = append(s, elem)
            start = i
        }
    }
    fmt.Printf("%v", s)
}

或者,如果您想将[][]byte转换为[]string

func convert(data [][]byte) []string {
    s := make([]string, len(data))
    for row := range data {
        s[row] = string(data[row])
    }

    return s
}

答案 1 :(得分:1)

如果您确实想要将文件内容转换为[]string,则可以使用更清晰(IMO)的bufio.Scanner,并且比您发布的代码更有效:

func readFile(filename string) ([]string, error) {
    file, err := os.Open(filename)
    if err != nil {
        return nil, err
    }   
    defer file.Close()

    scanner := bufio.NewScanner(file)

    var data []string

    for scanner.Scan() {
        line := scanner.Text()
        data = append(data, line)
    }   
    if err = scanner.Err(); err != nil {
        return nil, err
    }   

    return data, nil 
}

以下是比较原始函数(readFile1)和我的函数(readFile2)的基准*:

BenchmarkReadFile1-8         300       4632189 ns/op     3035552 B/op      10570 allocs/op
BenchmarkReadFile2-8        1000       1695820 ns/op     2169655 B/op      10587 allocs/op

*基准测试读取1.2 MiB和~10K行的样本文件

新代码在36%的时间内运行,71%的内存由原始函数使用。