要将[][]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的新手,我不确定这是最有效的方法。
答案 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%的内存由原始函数使用。