Метод csv.Writer.Flush

Метод csv.Writer.Flush записывает все данные, накопленные во внутреннем буфере, в основной поток вывода (например, в файл или в сетевой сокет). После вызова Flush буфер становится пустым, и все ранее записанные записи гарантированно передаются в нижележащий поток. Метод не принимает параметров и не возвращает значений. Если во время записи произошла ошибка, она сохраняется внутри объекта Writer и ее можно получить методом Error.

Синтаксис

gowriter.Flush()

Пример

Давайте создадим CSV-запись и запишем ее в файл, а затем вызовем Flush для принудительной записи всех данных:

gopackage main

import (
  "encoding/csv"
  "os"
)

func main() {
  file, _ := os.Create("data.csv")
  defer file.Close()

  writer := csv.NewWriter(file)

  writer.Write([]string{"a", "b", "c"})
  writer.Write([]string{"d", "e", "f"})

  writer.Flush()
}

После выполнения кода в файле data.csv будут записаны две строки:

goa,b,c
d,e,f

Пример

Давайте запишем несколько записей и проверим, что после вызова Flush буфер очищается. Для этого мы создадим писатель с буфером небольшого размера и вызовем Flush после каждой записи:

gopackage main

import (
  "bytes"
  "encoding/csv"
  "fmt"
)

func main() {
  buf := &bytes.Buffer{}
  writer := csv.NewWriter(buf)

  writer.Write([]string{"1", "2", "3"})
  writer.Flush()
  fmt.Printf("After first flush: %q\n", buf.String())

  writer.Write([]string{"4", "5", "6"})
  writer.Flush()
  fmt.Printf("After second flush: %q\n", buf.String())
}

Результат выполнения кода:

go"After first flush: "1,2,3\n""
"After second flush: "1,2,3\n4,5,6\n""

Пример

Важно помнить, что Flush не возвращает ошибку, а сохраняет ее внутри объекта. Проверим это, записав в недоступный файл:

gopackage main

import (
  "encoding/csv"
  "fmt"
  "os"
)

func main() {
  file, _ := os.OpenFile("/root/data.csv", os.O_CREATE|os.O_WRONLY, 0644)
  defer file.Close()

  writer := csv.NewWriter(file)
  writer.Write([]string{"a", "b", "c"})
  writer.Flush()

  if err := writer.Error(); err != nil {
    fmt.Printf("Error: %v\n", err)
  }
}

Результат выполнения кода:

go"Error: open /root/data.csv: permission denied"

Смотрите также

  • метод csv.Writer.Write,
    который записывает одну CSV-запись в буфер
  • метод csv.Writer.WriteAll,
    который записывает все записи и автоматически вызывает Flush
  • функцию csv.NewWriter,
    которая создает новый объект Writer
  • метод csv.Writer.Error,
    который возвращает последнюю ошибку записи