Go by Example - IT: Scrivere File

Scrivere file in Go segue dei pattern simili a quelli che abbiamo visto in precedenza per la lettura.

package main
import (
    "bufio"
    "fmt"
    "io/ioutil"
    "os"
)
func check(e error) {
    if e != nil {
        panic(e)
    }
}
func main() {

Come prima cosa, vediamo come si può scrivere una stringa (o dei byte) in un file.

    d1 := []byte("ciao\ngo\n")
    err := ioutil.WriteFile("/tmp/dat1", d1, 0644)
    check(err)

Per delle scritture più “scandite”, apriamo un file per la scrittura.

    f, err := os.Create("/tmp/dat2")
    check(err)

È idiomatico fare un defer di Close subito dopo aver aperto un file (ed aver controllato eventuali errori, ovviamente.)

    defer f.Close()

Puoi usare Write per scrivere slice di byte, come ci si aspetterebbe.

    d2 := []byte{100, 101, 105, 10}
    n2, err := f.Write(d2)
    check(err)
    fmt.Printf("scritti %d byte\n", n2)

Per comodità, c’è anche WriteString.

    n3, err := f.WriteString("write\n")
    fmt.Printf("scritti %d byte\n", n3)

Usa un Sync per assicurarti che i dati siano scritti su disco.

    f.Sync()

Il package bufio dispone di writer bufferizzati, oltre ai reader bufferizzati che abbiamo visto in precenza.

    w := bufio.NewWriter(f)
    n4, err := w.WriteString("bufferizzati\n")
    fmt.Printf("scritti %d byte\n", n4)

Anche in questo caso, usa Flush per essere sicuro che tutte le operazioni siano state apportate sul writer vero e proprio.

    w.Flush()
}

Prova ad eseguire il codice per la scrittura su file.

$ go run writing-files.go 
scritti 4 byte
scritti 6 byte
scritti 13 byte

… poi controlla i contenuti dei file scritti.

$ cat /tmp/dat1
ciao
go
$ cat /tmp/dat2
dei
write
bufferizzati

Nel prossimo esempio vedremo come applicare i concetti che abbiamo appena visto riguardanti l’I/O agli stream stdin e stdout.

Prossimo esempio: Line Filter.