os.File.Write în Go

Scrie octeți (Write) sau text (WriteString) în fișier, la poziția curentă.

Sintaxă
func (f *File) Write(b []byte) (n int, err error)
func (f *File) WriteString(s string) (n int, err error)

Ce face os.File.Write

Write scrie tot slice-ul b și returnează câți octeți a scris. Dacă n < len(b), sigur a apărut și o eroare. WriteString face același lucru pentru un string, fără să-l transformi tu în []byte.

Scrierea începe la poziția curentă (la început pentru os.Create, la final pentru O_APPEND) și o mută mai departe. Fiecare apel ajunge direct la sistemul de operare; pentru multe scrieri mici, bufio.Writer este mult mai rapid. Pentru text formatat folosește fmt.Fprintf(f, ...).

Parametri

Parametru Descriere
b Octeții de scris (la Write).
s Textul de scris (la WriteString).

Ce returnează

Numărul de octeți scriși și nil, sau o eroare. Atenție: n numără octeți, nu litere (ș, ă au câte 2 octeți).

Exemple

Exemplul 1: Write și WriteString

package main

import (
    "fmt"
    "os"
)

func main() {
    f, err := os.Create("bon.txt")
    if err != nil {
        fmt.Println("eroare:", err)
        return
    }
    defer f.Close()

    n1, _ := f.Write([]byte("Pâine 4,50 lei\n"))
    n2, _ := f.WriteString("Lapte 7,20 lei\n")
    n3, _ := fmt.Fprintf(f, "Total %.2f lei\n", 11.70)
    fmt.Println("octeți scriși:", n1, n2, n3)

    date, _ := os.ReadFile("bon.txt")
    fmt.Print(string(date))
}

Rezultat

octeți scriși: 16 15 16
Pâine 4,50 lei
Lapte 7,20 lei
Total 11.70 lei

Exemplul 2: Octeți, nu litere

package main

import (
    "fmt"
    "os"
    "unicode/utf8"
)

func main() {
    f, _ := os.Create("oras.txt")
    defer f.Close()

    text := "Timișoara"
    n, _ := f.WriteString(text)
    fmt.Println("octeți:", n, "| litere:", utf8.RuneCountInString(text))
}

Rezultat

octeți: 10 | litere: 9

Exemplul 3: Scriere cu verificarea erorii

package main

import (
    "fmt"
    "os"
)

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

    clienti := []string{"Ana,Iași", "Mihai,Cluj", "Ioana,Brașov"}
    for _, c := range clienti {
        if _, err := f.WriteString(c + "\n"); err != nil {
            fmt.Println("eroare la scriere:", err)
            return
        }
    }
    info, _ := f.Stat()
    fmt.Println("dimensiune:", info.Size(), "octeți")
}

Rezultat

dimensiune: 35 octeți

Greșeli frecvente

  • Faci mii de WriteString mici direct pe fișier. Fiecare e un apel de sistem; învelește fișierul într-un bufio.Writer.
  • Ignori eroarea de scriere. Discul plin sau un fișier deschis doar pentru citire trec neobservate.

Comenzi înrudite

  • os.File: Tipul care reprezintă un fișier deschis; îl obții cu os.Open, os.Create sau os.OpenFile.
  • io.Writer: Interfața pentru orice destinație în care se pot scrie octeți: fișiere, ecran, buffer-e, răspunsuri HTTP.
  • io.WriteString: Scrie un text în orice io.Writer, folosind metoda WriteString a acestuia dacă există.
  • 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.WriteFile: Scrie octeții dați într-un fișier: îl creează dacă lipsește și îi înlocuiește conținutul dacă există.