Ce face bufio.Writer.Flush
Flush scrie în Writer-ul de dedesubt tot ce s-a adunat în buffer. Fără el, datele care nu au umplut încă buffer-ul nu ajung niciodată în fișier sau pe ecran.
Returnează prima eroare de scriere. Dacă o scriere anterioară a eșuat, Writer-ul ține minte eroarea și toate apelurile următoare (inclusiv Flush) o returnează; de aceea e suficient să verifici eroarea lui Flush la final.
Ce returnează
nil sau eroarea de scriere.
Exemple
Exemplul 1: Fără Flush și cu Flush
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
f, _ := os.Create("raport.txt")
w := bufio.NewWriter(f)
w.WriteString("Vânzări martie: 15 200 lei\n")
date, _ := os.ReadFile("raport.txt")
fmt.Printf("înainte de Flush: %q\n", date)
w.Flush()
date, _ = os.ReadFile("raport.txt")
fmt.Printf("după Flush: %q\n", date)
f.Close()
}
Rezultat
înainte de Flush: ""
după Flush: "Vânzări martie: 15 200 lei\n"
Exemplul 2: Ieșire rapidă pe ecran
Un tipar des întâlnit în concursurile de programare: tot ce afișezi trece prin buffer, iar defer out.Flush() golește la final.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
for i := 1; i <= 5; i++ {
fmt.Fprintf(out, "%d x 7 = %d\n", i, i*7)
}
}
Rezultat
1 x 7 = 7
2 x 7 = 14
3 x 7 = 21
4 x 7 = 28
5 x 7 = 35
Exemplul 3: Eroarea ajunge la Flush
Fișierul este deschis doar pentru citire, așa că scrierea reală (la Flush) eșuează.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
os.WriteFile("doar-citire.txt", nil, 0o644)
f, _ := os.Open("doar-citire.txt")
defer f.Close()
w := bufio.NewWriter(f)
_, err := w.WriteString("text")
fmt.Println("WriteString:", err) // încă e doar în buffer
fmt.Println("Flush:", w.Flush())
}
Rezultat
WriteString: <nil>
Flush: write doar-citire.txt: bad file descriptor
Greșeli frecvente
- Verifici doar erorile lui
WriteString. Scrierea reală se face adesea abia laFlush; verifică și eroarea lui. - Pui
defer w.Flush()și ieși cuos.Exitsaulog.Fatal. Defer-ul nu rulează.
Comenzi înrudite
bufio.NewWriter: Învelește un io.Writer într-un bufio.Writer, care strânge scrierile mici într-un buffer și le trimite în blocuri.os.File.Sync: Forțează scrierea pe disc a datelor din fișier, ca să nu se piardă la o pană de curent.bufio.Writer.WriteString: WriteString adaugă un text în buffer; WriteRune adaugă un singur caracter Unicode, codat UTF-8.