2016-03-19 2 views
1

Я хотел бы знать простой и эффективный способ печати таблицы в GO. Решение, которое я нашел, работает, но это действительно уродливо.Эффективный способ печати таблицы в GO

много танков!

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/). –

ответ

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

Выход:

$ cat file.tsv 
a b 2.7000 
$ 

Если вы используете goroutines, вот версия, которая использует семафор для защиты csv.Writer.

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

ничего себе! намного лучше, чем мое решение! ;) THKS! – Fred

+0

Можно ли использовать w.Write в параллельной рутине GO? потому что я попробовал один и тот же код, и некоторые строки слиты вместе :) – Fred

+0

@Fred: Нет. У вас будет состояние гонки на csv.Writer: [Представляем детектор гоночных расов] (http://blog.golang.org/ раса-детектор). См. Мой пересмотренный ответ для примера, который использует мьютекс для защиты csv.Writer. – peterSO

Смежные вопросы