bufio.Scanner
- Go kursu
- Orta seviye
- Ders 38/80
- 4 dk
bufio.Scanner ile satır okumayı öğrenirsin.
bufio.Scanner
bufio.Scanner bir Reader'ı satır satır (ya da kelime kelime) okumanın en kolay yoludur:
sc := bufio.NewScanner(os.Stdin)
for sc.Scan() {
satir := sc.Text()
fmt.Println(len(satir))
}
if err := sc.Err(); err != nil {
log.Fatal(err)
}Scan false döndüğünde okuma bitmiştir; sebebin hata olup olmadığını Err() söyler (EOF hata sayılmaz).
Bölme fonksiyonları
Scanner neyi "token" sayacağını bir bölme fonksiyonuyla belirler: varsayılan bufio.ScanLines, ayrıca ScanWords, ScanRunes ve ScanBytes vardır.
sc := bufio.NewScanner(strings.NewReader("bir iki üç"))
sc.Split(bufio.ScanWords)
n := 0
for sc.Scan() { n++ }
fmt.Println(n) // 3Yazarken de bufio.NewWriter küçük yazımları birleştirir; sonunda Flush() çağırmayı unutma.
Uygulama Satır say
bufio.Scanner ile "elma\narmut\n\nkiraz" metnini satır satır oku; boş olmayan satırları say ve sayıyı yazdır. Döngüden sonra sc.Err()'i kontrol et.
Başlangıç kodu
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"bufio"
"fmt"
"strings"
)
func main() {
sc := bufio.NewScanner(strings.NewReader("elma\narmut\n\nkiraz"))
n := 0
for sc.Scan() {
if sc.Text() != "" {
n++
}
}
if err := sc.Err(); err != nil {
fmt.Println(err)
return
}
fmt.Println(n)
}Beklenen çıktı
3
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Scanner varsayılan olarak en fazla kaç baytlık satır okuyabilir?
- Sınırsız
- 1 KB
- 1 MB
- 64 KB; daha uzunsa bufio.ErrTooLong verir Doğru cevap
Açıklama: Uzun satırlar için sc.Buffer(make([]byte, 0, 1024*1024), 10*1024*1024) ile tampon büyütülür.
2 Kelime kelime
sc := bufio.NewScanner(r)
sc.Split(bufio.____)
sc := bufio.NewScanner(r)
sc.Split(bufio.ScanWords)
Açıklama: ScanWords boşluklarla ayrılmış kelimeleri tek tek döndürür.
3 bufio parçası
| Kavram | Anlamı |
|---|---|
sc.Scan() |
Sonraki token'a geç |
sc.Text() |
Token'ı string olarak al |
sc.Err() |
Okuma hatası |
w.Flush() |
Tamponu yaz |