GO

2016-03-19 15 views
1

Tablosunda tablo yazdırmanın etkili yolu GO tablosunu basmanın basit ve verimli bir yolunu bilmek istiyorum. Bulduğum çözüm işe yarıyor ama gerçekten çirkin.GO

Birçok Tank! Örneğin

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

['tabwriter'] (https://golang.org/pkg/text/tabwriter/) paketine bakmalısınız. –

cevap

2

,

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

Çıktı: Eğer goroutines kullanırsanız

$ cat file.tsv 
a b 2.7000 
$ 

, burada csv.Writer korumak için bir muteks'in kullanan bir versiyonu.

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

vay! çözümümden çok daha iyi! ;) thks! – Fred

+0

GO paralel rutinde w.Write kullanmak mümkün mü? çünkü aynı kodu denedim ve bazı satırlar birleştirildi :) – Fred

+0

@Fred: Hayır. Csv.Writer'de bir yarış durumunuz olacak: [Go Race Detector'a Giriş] (http://blog.golang.org/ yarış detektörü). Csv.Writer'i korumak için bir mutex kullanan bir örnek için gözden geçirilmiş cevabımı görün. – peterSO