type Writer … // NewWriter returns a new Writer that writes to w. func NewWriter(w io.Writer) *Writer { … } // Write writes a single CSV record to w along with any necessary quoting. // A record is a slice of strings with each string being one field. // Writes are buffered, so [Writer.Flush] must eventually be called to ensure // that the record is written to the underlying [io.Writer]. func (w *Writer) Write(record []string) error { … } // Flush writes any buffered data to the underlying [io.Writer]. // To check if an error occurred during Flush, call [Writer.Error]. func (w *Writer) Flush() { … } // Error reports any error that has occurred during // a previous [Writer.Write] or [Writer.Flush]. func (w *Writer) Error() error { … } // WriteAll writes multiple CSV records to w using [Writer.Write] and // then calls [Writer.Flush], returning any error from the Flush. func (w *Writer) WriteAll(records [][]string) error { … } // fieldNeedsQuotes reports whether our field must be enclosed in quotes. // Fields with a Comma, fields with a quote or newline, and // fields which start with a space must be enclosed in quotes. // We used to quote empty strings, but we do not anymore (as of Go 1.4). // The two representations should be equivalent, but Postgres distinguishes // quoted vs non-quoted empty string during database imports, and it has // an option to force the quoted behavior for non-quoted CSV but it has // no option to force the non-quoted behavior for quoted CSV, making // CSV with quoted empty strings strictly less useful. // Not quoting the empty string also makes this package match the behavior // of Microsoft Excel and Google Drive. // For Postgres, quote the data terminating string `\.`. func (w *Writer) fieldNeedsQuotes(field string) bool { … }