【问题标题】:Most efficient way to convert a [][]byte to []string in golang在 golang 中将 [][]byte 转换为 []string 的最有效方法
【发布时间】:2017-06-02 18:17:57
【问题描述】:

要将[][]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 的新手,我不确定这是最有效的方法。

【问题讨论】:

    标签: go


    【解决方案1】:

    最有效的方法是删除这一步: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
    }
    

    【讨论】:

    • 这不会将[][]byte 转换为[]string。
    • @Krom 现在可以了
    • 是的,但提问者在问,这是否是最有效的方法。那么,是吗?
    • @ΔλЛ 要将[] [] byte 转换为[] string,我注意到您的提议和我的代码没有区别。
    • 确实,我相信这是最有效的方法。
    【解决方案2】:

    如果您确实想将文件内容转换为[]string,可以使用bufio.Scanner,它比您发布的代码更简洁(IMO)且更高效:

    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% 的原始函数使用的内存中运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-15
      • 2010-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      相关资源
      最近更新 更多