fmt.Fprintln în Go

Scrie valorile într-un io.Writer (fișier, buffer, răspuns HTTP) cu regulile lui Println, respectiv Print.

Sintaxă
func Fprintln(w io.Writer, a ...any) (n int, err error)
func Fprint(w io.Writer, a ...any) (n int, err error)

Ce face fmt.Fprintln

fmt.Fprintln și fmt.Fprint fac exact ce fac Println și Print, dar scriu în destinația primită ca prim argument. Destinația poate fi orice valoare care implementează io.Writer: os.Stdout (ecranul), os.Stderr (ieșirea de erori), un fișier deschis, un strings.Builder, un bytes.Buffer sau http.ResponseWriter într-un server web.

De fapt, fmt.Println(x) este doar fmt.Fprintln(os.Stdout, x). Când scrii o funcție care primește un io.Writer, ea poate scrie oriunde, iar în teste poți verifica ce a scris folosind un buffer.

Parametri

Parametru Descriere
w io.Writer Destinația: orice tip cu metoda Write([]byte) (int, error).
a ...any Valorile de scris.

Ce returnează

Numărul de octeți scriși și eroarea de scriere (de exemplu disc plin). La fișiere merită verificată.

Exemple

Exemplul 1: Aceeași funcție scrie pe ecran sau într-un buffer

Funcția raport nu știe unde scrie. O chemăm o dată cu os.Stdout și o dată cu un strings.Builder.

package main

import (
	"fmt"
	"io"
	"os"
	"strings"
)

func raport(w io.Writer, elev string, nota int) {
	fmt.Fprintln(w, "Elev:", elev)
	fmt.Fprint(w, "Nota: ", nota, "\n")
}

func main() {
	raport(os.Stdout, "Ana", 10)

	var sb strings.Builder
	raport(&sb, "Ion", 8)
	fmt.Printf("În buffer: %q\n", sb.String())
}

Rezultat

Elev: Ana
Nota: 10
În buffer: "Elev: Ion\nNota: 8\n"

Exemplul 2: Scriere într-un fișier, cu verificarea erorii

package main

import (
	"fmt"
	"os"
)

func main() {
	f, err := os.Create("orase.txt")
	if err != nil {
		fmt.Println("nu pot crea fișierul:", err)
		return
	}
	for _, oras := range []string{"Iași", "Cluj", "Timișoara"} {
		if _, err := fmt.Fprintln(f, oras); err != nil {
			fmt.Println("eroare la scriere:", err)
		}
	}
	f.Close()

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

Rezultat

Iași
Cluj
Timișoara

Greșeli frecvente

  • Dai un strings.Builder sau bytes.Buffer prin valoare: fmt.Fprintln(sb, ...). Metoda Write are receptor pointer, deci trebuie &sb; altfel programul nu compilează.
  • Uiți să închizi fișierul (f.Close()). Datele pot rămâne nescrise, iar fișierul rămâne deschis până la ieșirea programului.

Comenzi înrudite

  • fmt.Println: Afișează valorile pe ecran: Println pune spații între ele și trece la rând nou, Print nu.
  • fmt.Printf: Afișează text formatat cu %d, %s, %.2f etc.; Sprintf returnează textul, Fprintf îl scrie într-un fișier sau alt Writer.
  • strings.Builder: Construiește eficient un text din multe bucăți: adaugi cu WriteString, WriteByte, WriteRune sau Write și obții rezultatul cu String().
  • bytes.Buffer: Un buffer de octeți care crește singur: scrii în el cu Write/WriteString/WriteByte/WriteRune și citești cu String() sau Bytes().