Go Academy · Lektion

Bufrede readers

Læs effektivt med bufio

Lektion 1 af 413 trin

Bufrede readers er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Go Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Go Academy-kurset indeholder 4 lektioner i alt.

Hvorfor læsninger med buffer

Hvis du læser én byte ad gangen fra en fil eller et netværk, udløser det et systemkald hver gang. Det er langsomt.

Pakken bufio omslutter en reader og læser store blokke ind i en buffer i hukommelsen, så dine små læsninger kan leveres fra bufferen.

  • Færre systemkald
  • Meget hurtigere ved mange små læsninger

Oprette en bufio.Reader

Omslut enhver io.Reader med bufio.NewReader. Her omslutter vi en strings.Reader.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("Hello, Go!"))
	fmt.Printf("buffered reader ready: %T\n", r)
}

Læse byte

ReadByte returnerer den næste enkeltbyte. Den leveres fra bufferen, ikke fra et nyt systemkald.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("Go"))
	b1, _ := r.ReadByte()
	b2, _ := r.ReadByte()
	fmt.Printf("%c%c\n", b1, b2)
}

ReadString frem til et afgrænsningstegn

ReadString(delim) læser frem til den første forekomst af afgrænsningsbyten og returnerer alt inklusive afgrænsningstegnet.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("first,second,third"))
	part, _ := r.ReadString(',')
	fmt.Printf("%q\n", part)
}

Kig fremad

Peek(n) returnerer de næste n byte uden at forbruge dem. Det er nyttigt, når du vil beslutte, hvordan inputtet skal fortolkes, før du binder dig.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("HTTP/1.1"))
	head, _ := r.Peek(4)
	fmt.Printf("starts with: %s\n", head)
}

Bufferstørrelse

bufio.NewReaderSize(r, size) angiver bufferens kapacitet. En større buffer betyder færre underliggende læsninger, men bruger mere hukommelse.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReaderSize(strings.NewReader("data"), 4096)
	fmt.Println("buffer size:", r.Size())
}

ReadLine sammenlignet med ReadString

ReadString('\n') bevarer linjeskiftet, men mange parserforetrækker at fjerne det. Scanner (i næste lektion) håndterer dette automatisk.

Brug ReadString, når du har brug for fuld kontrol over afgrænsningstegn.

Håndtering af io.EOF

Når den underliggende datastrøm er udtømt, returnerer læsemetoderne io.EOF. Kontrollér altid dette, så du ved, hvornår du skal stoppe.

package main

import (
	"bufio"
	"fmt"
	"io"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("ab"))
	for {
		c, err := r.ReadByte()
		if err == io.EOF {
			break
		}
		fmt.Printf("%c", c)
	}
	fmt.Println()
}

ReadRune til Unicode

ReadRune afkoder en hel UTF-8-rune, som kan strække sig over flere byte. Brug den til tekst med ikke-ASCII-tegn.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("héllo"))
	for {
		ru, _, err := r.ReadRune()
		if err != nil {
			break
		}
		fmt.Printf("%c ", ru)
	}
	fmt.Println()
}

Læse til slut

Et almindeligt mønster er at køre en løkke med ReadString frem til EOF for at behandle en datastrøm linje for linje og samtidig bevare den detaljerede kontrol.

package main

import (
	"bufio"
	"fmt"
	"io"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("a\nb\nc\n"))
	for {
		line, err := r.ReadString('\n')
		fmt.Print("got: " + line)
		if err == io.EOF {
			break
		}
	}
}

Hvornår skal du bruge bufio.Reader

  • Til at omslutte langsomme kilder (filer, sockets)
  • Ved mange små læsninger
  • Når du skal kigge frem eller læse efter afgrænsningstegn eller runer

Ved enkel scanning linje for linje bør du foretrække bufio.Scanner (i næste lektion).

Hurtig test

Test din forståelse af readers med buffer.

Opsummering

Du har lært, hvordan bufio.Reader reducerer antallet af systemkald ved at bruge buffering.

  • NewReader / NewReaderSize omslutter en io.Reader
  • ReadByte, ReadRune, ReadString leverer data fra bufferen
  • Peek kigger frem uden at forbruge data
  • Stop ved io.EOF
Gratis at komme i gang

Lær Go med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
51
Lektioner
203

Ofte stillede spørgsmål

Er lektionen “Bufrede readers” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Bufrede readers”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Go Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Bufrede readers”?

Læs effektivt med bufio Du øver dig i Go Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Go Academy?

Der kræves ingen tidligere erfaring. Go Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “Bufrede readers”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Go Academy-lektion?

Ja. Alle Go Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Bufrede readers
  2. Scannere
  3. Bufrede writers
  4. Streaming af store filer
← Tilbage til Go Academy