在 GO 中打印表格的有效方法

Fre*_*red 6 printing file 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())
Run Code Online (Sandbox Code Playgroud)

17x*_*nde 7

tabwriter标准库中的包对于这种事情简单易行:

w := tabwriter.NewWriter(os.Stdout, 1, 1, 1, ' ', 0)
fmt.Fprintln(w, "a\tb\tc\td\t")
fmt.Fprintln(w, "aa\tbb\tcc\t")
fmt.Fprintln(w, "aaa\tbbb\tccc\t")
fmt.Fprintln(w, "aaaa\tbbbb\tcccc\tdddd\t")
w.Flush()

// Prints out:
// a    b    c    d 
// aa   bb   cc   
// aaa  bbb  ccc  
// aaaa bbbb cccc dddd 
Run Code Online (Sandbox Code Playgroud)

您可以将 os.Stdout 替换为任何io.Writer.


pet*_*rSO 4

例如,

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

$ cat file.tsv
a   b   2.7000
$
Run Code Online (Sandbox Code Playgroud)

如果您使用 goroutine,这里有一个使用互斥锁来保护 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)
    }
}
Run Code Online (Sandbox Code Playgroud)