2017-06-01 4 views
0

zu konvertieren [][]byte zu []string konvertieren, ich dies tuneffizienteste Weg, eine [] [] Byte [] string in golang

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) 

Ich bin neu in golang, ich bin nicht sicher, ist am effizientesten Weg, dies zu tun.

Antwort

1

Wenn Sie Möchten Sie tatsächlich einen Dateiinhalt in eine []string konvertieren, können Sie bufio.Scanner verwenden, die sauberer (IMO) und effizienter ist als der Code, den Sie gepostet haben:

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 
} 

Hier ist ein Benchmark * die ursprüngliche Funktion zu vergleichen (readFile1) und meine Funktion (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 

* die Benchmark eine Beispieldatei von 1,2 MiB lesen und ~ 10K Linien

Der neue Code wird in 36% der Zeit und 71% des von der ursprünglichen Funktion verwendeten Speichers ausgeführt.

2

Der effektivste Weg wäre, diesen Schritt zu entfernen: db := bytes.Split(data, []uint8("\n")) und stattdessen iterieren data wie folgt aus:

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) 
} 

Oder wenn Sie [][]byte zu []string konvertieren:

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

    return s 
} 
+0

Das konvertiert ein '[] [] Byte nicht in' [] string'. – Krom

+0

@Krom jetzt tut es – syntagma

+0

Ja, aber der Fragesteller fragte, ob das der effizienteste Weg ist, dies zu tun. So ist es? – Krom

Verwandte Themen