package csvwriter import ( "bytes" "os" ) type CsvWriter struct { f *os.File buf bytes.Buffer } func NewCsvWriter(path string) (*CsvWriter, error) { f, err := os.Create(path) if err != nil { return nil, err } w := &CsvWriter{ f: f, } return w, nil } func (c *CsvWriter) Close() error { c.Sync() return c.f.Close() } func (c *CsvWriter) Write(strs []string) error { for i, str := range strs { if i != 0 { _, err := c.buf.Write([]byte(",")) if err != nil { return err } } _, err := c.buf.Write([]byte(str)) if err != nil { return err } } c.buf.WriteByte('\n') if c.buf.Len() > 1*1024*1024 { err := c.Sync() if err != nil { return err } } return nil } func (c *CsvWriter) Sync() error { _, err := c.f.Write(c.buf.Bytes()) if err != nil { return err } c.buf.Reset() return nil }