io.Copy
- Go kursu
- Orta seviye
- Ders 39/80
- 4 dk
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
package main
import (
"bytes"
"crypto/sha256"
"fmt"
"io"
"strings"
)
func main() {
// buraya yaz
}Örnek çözüm
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
n, err := io.____(os.Stdout, strings.NewReader("merhaba"))
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ı |