CodeBlanks Logo Icon CodeBlanks

io.Reader

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))  // merhaba

Kullanı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

main.go
package main

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

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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 &gt; 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

Soru
n, err := r.Read(buf)
if err == io.____ {
    break
}
Cevap
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ı

Orta seviye bölümündeki tüm dersler