2016-03-19 1 views
1

zu drucken Ich möchte eine einfache und effiziente Möglichkeit zum Drucken einer Tabelle in GO wissen. Die Lösung, die ich gefunden habe funktioniert, aber es ist wirklich hässlich.Die effiziente Möglichkeit, eine Tabelle in GO

viele Tanks!

outfile := "file.tsv" 
f, err := os.Create(outfile)var buffer bytes.Buffer 

      buffer.WriteString(a[i]) 
      buffer.WriteString("\t") 
      buffer.WriteString(a[j]) 
      buffer.WriteString("\t") 
      buffer.WriteString(strconv.FormatFloat(x, 'f', 4, 64)) 
      buffer.WriteString("\n") 
      // // write results to outfile 
      f.WriteString(buffer.String()) 
+0

Sie sollten sich das Paket ['tabwriter'] (https://golang.org/pkg/text/tabwriter/) ansehen. –

Antwort

2

Zum Beispiel

package main 

import (
    "encoding/csv" 
    "fmt" 
    "os" 
    "strconv" 
) 

func main() { 
    outfile := "file.tsv" 
    f, err := os.Create(outfile) 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    defer f.Close() 
    w := csv.NewWriter(f) 
    defer w.Flush() 
    w.Comma = '\t' 

    a := []string{"a", "b"} 
    i, j := 0, 1 
    x := float64(2.7) 

    // Write row. 
    err = w.Write(
     []string{ 
      a[i], a[j], 
      strconv.FormatFloat(x, 'f', 4, 64), 
     }, 
    ) 
    if err != nil { 
     fmt.Println(err) 
    } 
} 

Ausgang:

$ cat file.tsv 
a b 2.7000 
$ 

Wenn Sie goroutines verwenden, hier ist eine Version, die eine Mutex verwendet die csv.Writer zu schützen.

package main 

import (
    "encoding/csv" 
    "fmt" 
    "os" 
    "strconv" 
    "sync" 
) 

type csvWriter struct { 
    w *csv.Writer 
    m sync.Mutex 
} 

func (c *csvWriter) write(rec []string) error { 
    c.m.Lock() 
    defer c.m.Unlock() 
    return c.w.Write(rec) 
} 

func (c *csvWriter) flush() { 
    c.m.Lock() 
    defer c.m.Unlock() 
    c.w.Flush() 
} 

func main() { 
    outfile := "file.tsv" 
    f, err := os.Create(outfile) 
    if err != nil { 
     fmt.Println(err) 
     os.Exit(1) 
    } 
    defer f.Close() 
    w := csvWriter{w: csv.NewWriter(f)} 
    defer w.flush() 
    w.w.Comma = '\t' 

    a := []string{"a", "b"} 
    i, j := 0, 1 
    x := float64(2.7) 

    // Write row. 
    err = w.write(
     []string{ 
      a[i], a[j], 
      strconv.FormatFloat(x, 'f', 4, 64), 
     }, 
    ) 
    if err != nil { 
     fmt.Println(err) 
    } 
} 
+0

wow! viel besser als meine Lösung! ;) thks! – Fred

+0

Ist es möglich, w.Write in einer parallelen GO-Routine zu verwenden? weil ich den gleichen Code probiert habe und einige Zeilen zusammengeführt wurden :) – Fred

+0

@Fred: Nein. Sie werden eine Race-Bedingung auf dem csv.Writer haben: [Einführung der Go Race Detector] (http://blog.golang.org/ Renn-Detektor). Siehe meine überarbeitete Antwort für ein Beispiel, das einen Mutex verwendet, um den csv.Writer zu schützen. – peterSO