CodeBlanks Logo Icon CodeBlanks

io.Copy

io.Copy ile veriyi aktarmayı öğrenirsin.

io.Copy

io.Copy(dst, src) bir Reader'dan Writer'a veriyi akış hâlinde kopyalar: tümünü belleğe almadan 32 KB'lık parçalarla çalışır. Gigabaytlık dosyalar da sabit bellekle kopyalanır.

src, _ := os.Open("buyuk.iso")
defer src.Close()
dst, _ := os.Create("kopya.iso")
defer dst.Close()
n, err := io.Copy(dst, src)
fmt.Println(n, "bayt kopyalandı")

Akış zincirleri

Reader ve Writer'lar birleştirilerek tek geçişte karmaşık işlemler yapılır. Örneğin bir dosyayı sıkıştırırken aynı anda özetini (hash) almak:

h := sha256.New()
gz := gzip.NewWriter(io.MultiWriter(cikis, h))
io.Copy(gz, giris)
gz.Close()
fmt.Printf("%x\n", h.Sum(nil))

io.TeeReader(r, w) ise okurken okunanı aynı anda bir Writer'a da yazar.

Uygulama Kopyala ve özetle

strings.NewReader("gopher") içeriğini io.Copy ile bir bytes.Buffer'a kopyalarken io.TeeReader ile aynı anda sha256.New() özetine de yaz. Kopyalanan bayt sayısını ve özetin ilk 4 baytını %x ile yazdır.

Başlangıç kodu

main.go
package main

import (
    "bytes"
    "crypto/sha256"
    "fmt"
    "io"
    "strings"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "bytes"
    "crypto/sha256"
    "fmt"
    "io"
    "strings"
)

func main() {
    h := sha256.New()
    var buf bytes.Buffer
    n, err := io.Copy(&buf, io.TeeReader(strings.NewReader("gopher"), h))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Printf("%d %x\n", n, h.Sum(nil)[:4])
}

Beklenen çıktı

6 9cc1ee45

Soru ve cevaplar

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

1 Büyük bir dosyayı HTTP yanıtına göndermek için hangisi en az belleği kullanır?

  • os.ReadFile sonra Write
  • Dosyayı string'e çevirmek
  • io.Copy(w, f) Doğru cevap
  • b, _ := io.ReadAll(f); w.Write(b)

Açıklama: io.Copy parça parça akıtır; ReadAll ve ReadFile tüm dosyayı belleğe alır.

2 Akışla kopyala

Soru
n, err := io.____(os.Stdout, strings.NewReader("merhaba"))
Cevap
n, err := io.Copy(os.Stdout, strings.NewReader("merhaba"))

Açıklama: io.Copy Reader'dan Writer'a veriyi parça parça aktarır ve kopyalanan bayt sayısını döndürür.

3 Yardımcı ve görevi

Kavram Anlamı
io.Copy Akışla kopya
io.TeeReader Okurken çoğalt
io.MultiWriter Yazarken çoğalt
io.LimitReader Bayt sınırı

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