io.Reader
- Go kursu
- Orta seviye
- Ders 35/80
- 4 dk
Reader interface'ini ve Read metodunu öğrenirsin.
io.Reader
io.Reader Go'nun en önemli arayüzlerinden biridir; tek yöntemi vardır:
type Reader interface {
Read(p []byte) (n int, err error)
}Read verilen dilime en fazla len(p) bayt yazar ve kaç bayt yazdığını döndürür. Veri bitince io.EOF hatası döner. Dosyalar, ağ bağlantıları, HTTP gövdeleri, strings.Reader ve bytes.Buffer hepsi Reader'dır; bu yüzden aynı kod hepsinde çalışır.
io.ReadAll ve sarmalayıcılar
Küçük veriyi tümüyle okumak için io.ReadAll(r) yeterlidir. Reader'lar birbirini sarabilir: io.LimitReader(r, n) en fazla n bayt okur, io.MultiReader(a, b) art arda okur, gzip.NewReader(r) sıkıştırılmış veriyi açar.
r := io.LimitReader(strings.NewReader("merhaba dünya"), 7)
b, _ := io.ReadAll(r)
fmt.Println(string(b)) // merhabaKullanıcıdan gelen gövdeyi LimitReader ile sınırlamak bellek saldırılarını önler.
Uygulama Parça parça oku
strings.NewReader("gopher") üzerinden 4 baytlık bir tamponla döngüde oku. Her okumada okunan parçayı yazdır; io.EOF gelince döngüden çık.
Başlangıç kodu
package main
import (
"fmt"
"io"
"strings"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"io"
"strings"
)
func main() {
r := strings.NewReader("gopher")
buf := make([]byte, 4)
for {
n, err := r.Read(buf)
if n > 0 {
fmt.Println(string(buf[:n]))
}
if err == io.EOF {
break
}
}
}Beklenen çıktı
goph er
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 <code>Read</code> hem <code>n > 0</code> hem <code>io.EOF</code> döndürürse ne yapmalısın?
- Hata olarak panic üret
- Tekrar oku
- Önce n baytı işle, sonra okumayı bitir Doğru cevap
- Baytları at
Açıklama: Sözleşmeye göre okunan baytlar her zaman önce işlenir; EOF yalnızca başka veri kalmadığını söyler.
2 Veri bitti
n, err := r.Read(buf)
if err == io.____ {
break
}
n, err := r.Read(buf)
if err == io.EOF {
break
}
Açıklama: io.EOF okunacak veri kalmadığını bildiren özel hatadır.
3 Reader türü
| Kavram | Anlamı |
|---|---|
os.File |
Dosya |
strings.Reader |
Metin |
http.Response.Body |
HTTP gövdesi |
io.LimitReader |
Bayt sınırı |