CodeBlanks Logo Icon CodeBlanks

io.Writer

Writer interface'ini ve Write metodunu öğrenirsin.

io.Writer

io.Writer Reader'ın karşılığıdır:

type Writer interface {
    Write(p []byte) (n int, err error)
}

os.Stdout, dosyalar, bytes.Buffer, http.ResponseWriter, hash'ler ve sıkıştırıcılar Writer'dır. fmt.Fprintf(w, ...) herhangi bir Writer'a biçimli yazar; bu sayede aynı fonksiyon ekrana, dosyaya veya HTTP yanıtına çıktı üretebilir.

io.MultiWriter ve kısa yazma

io.MultiWriter(a, b) her yazımı birden çok hedefe çoğaltır (ör. hem ekrana hem log dosyasına). Sözleşmeye göre Write tüm baytları yazmadıysa hata döndürmek zorundadır; bu yüzden yalnızca err'i kontrol etmek genellikle yeterlidir.

f, _ := os.Create("log.txt")
w := io.MultiWriter(os.Stdout, f)
fmt.Fprintln(w, "başladı")  // iki yere de yazılır

Uygulama Test edilebilir çıktı

rapor(w io.Writer, adlar []string) yaz; her adı "- " + ad biçiminde ayrı satıra yazsın. Bir bytes.Buffer'a çağırıp buf.String()'i fmt.Print ile yazdır.

Başlangıç kodu

main.go
package main

import (
    "bytes"
    "fmt"
    "io"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "bytes"
    "fmt"
    "io"
)

func rapor(w io.Writer, adlar []string) {
    for _, ad := range adlar {
        fmt.Fprintln(w, "- "+ad)
    }
}

func main() {
    var buf bytes.Buffer
    rapor(&buf, []string{"Ada", "Can"})
    fmt.Print(buf.String())
}

Beklenen çıktı

- Ada
- Can

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bir rapor fonksiyonunu test edilebilir yapmak için en iyi imza hangisidir?

  • func rapor(dosya string)
  • func rapor(w io.Writer, v Veri) error Doğru cevap
  • func rapor(v Veri) // os.Stdout'a yazar
  • func rapor() string

Açıklama: Writer alan fonksiyon testte bytes.Buffer ile çağrılıp çıktısı kontrol edilebilir; üretimde os.Stdout veya dosya verilir.

2 Writer'a yaz

Soru
func selam(w io.Writer, ad string) {
    fmt.____(w, "Merhaba %s\n", ad)
}
Cevap
func selam(w io.Writer, ad string) {
    fmt.Fprintf(w, "Merhaba %s\n", ad)
}

Açıklama: Fprintf biçimli metni verilen io.Writer'a yazar.

3 Writer hedefi

Kavram Anlamı
os.Stdout Ekran
bytes.Buffer Bellek (test)
http.ResponseWriter HTTP yanıtı
io.MultiWriter Birden çok hedef

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