Go Academy · Lektion

Scannere

Læs linje for linje

Lektion 2 af 413 trin

Scannere er en gratis Go Academy-lektion på CoddyKit. Dette er lektion 2 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.

Hvad er bufio.Scanner

bufio.Scanner er den nemmeste måde at læse input token for token, oftest linje for linje.

Den skjuler buffering og håndtering af afgrænsningstegn og fjerner det afsluttende linjeskift for dig.

Scanne linjer

Opret en scanner, og kør derefter en løkke med Scan(), som returnerer false ved slutningen. Læs det aktuelle token med Text().

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("one\ntwo\nthree"))
	for s.Scan() {
		fmt.Println("line:", s.Text())
	}
}

Scanne ord

Angiv splitfunktionen med Split(bufio.ScanWords) for at opdele efter blanktegn i stedet for linjer.

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("the quick brown fox"))
	s.Split(bufio.ScanWords)
	for s.Scan() {
		fmt.Println(s.Text())
	}
}

Tælle token

Med scanners er det enkelt at tælle. Her tæller vi ord.

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("a b c d e"))
	s.Split(bufio.ScanWords)
	count := 0
	for s.Scan() {
		count++
	}
	fmt.Println("words:", count)
}

Byte sammenlignet med tekst

Text() returnerer en kopi af en streng. Bytes() returnerer den underliggende slice, som genbruges ved det næste kald til Scan() — kopiér den, hvis du skal gemme den.

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("data"))
	s.Scan()
	fmt.Println(len(s.Bytes()), "bytes")
}

Scanne runer

bufio.ScanRunes opdeler inputtet i UTF-8-runer, ét token pr. tegn.

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("Gö"))
	s.Split(bufio.ScanRunes)
	for s.Scan() {
		fmt.Printf("[%s]", s.Text())
	}
	fmt.Println()
}

Kontrollere fejl

Hvis Scan() returnerer false, kan det betyde EOF eller en fejl. Kald s.Err() efter løkken for at skelne mellem dem.

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("ok\nfine"))
	for s.Scan() {
		fmt.Println(s.Text())
	}
	if err := s.Err(); err != nil {
		fmt.Println("error:", err)
	}
}

Grænsen for tokenstørrelse

Som standard må ét token ikke overskride bufio.MaxScanTokenSize (64 KB). En længere linje får Scan() til at stoppe med en fejl.

Udvide bufferen

Brug Buffer(buf, max) for at tillade større token. Angiv en startbuffer og en maksimal størrelse.

package main

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

func main() {
	s := bufio.NewScanner(strings.NewReader("long line here"))
	buf := make([]byte, 0, 1024)
	s.Buffer(buf, 1024*1024)
	for s.Scan() {
		fmt.Println(s.Text())
	}
}

Brugerdefinerede splitfunktioner

En splitfunktion har signaturen func(data []byte, atEOF bool) (advance int, token []byte, err error). Du kan opdele ved kommaer, med faste bredder eller på hvad som helst.

Scanner sammenlignet med Reader

  • Scanner: enkel, token for linjer eller ord, fjerner automatisk linjeskift, standardgrænse på 64 KB
  • Reader: fuld kontrol, ingen størrelsesgrænse, manuel håndtering af afgrænsningstegn

Start med Scanner, og skift til Reader, når du har brug for mere.

Hurtig test

Test din viden om Scanner.

Opsummering

Du har lært at læse input token for token med bufio.Scanner.

  • Løkke med Scan() + Text()/Bytes()
  • Split med ScanLines/ScanWords/ScanRunes
  • Kontrollér Err() efter løkken
  • Brug Buffer til token over 64 KB
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 “Scannere” gratis?

Ja — alle 3 lektioner i læringssporet Go Academy, inklusive “Scannere”, 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 “Scannere”?

Læs linje for linje 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 2 af 4.

Hvor lang tid tager lektionen “Scannere”?

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