Mengimplementasikan Reader Kustom
Bangun stream Anda sendiri
Mengimplementasikan Reader Kustom adalah pelajaran Go Academy gratis di CoddyKit. Ini adalah pelajaran 4 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Go Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Go Academy mencakup 4 pelajaran total.
Bangun Aliran Anda Sendiri
Anda dapat membuat sumber data khusus dengan mengimplementasikan antarmuka io.Reader yang hanya memiliki satu metode. Tipe Anda kemudian dapat digunakan dengan setiap pembantu io.
Metode yang Harus Diimplementasikan
Implementasikan Read(p []byte) (n int, err error) pada tipe Anda. Isi p, kembalikan jumlahnya, dan kembalikan io.EOF setelah selesai.
Pembaca Konstan
Berikut pembaca yang terus-menerus menghasilkan byte yang sama, dibatasi dengan LimitReader.
package main
import (
"fmt"
"io"
)
type constReader struct{ ch byte }
func (c constReader) Read(p []byte) (int, error) {
for i := range p {
p[i] = c.ch
}
return len(p), nil
}
func main() {
r := io.LimitReader(constReader{ch: 'A'}, 5)
data, _ := io.ReadAll(r)
fmt.Println(string(data))
}Menandai EOF
Kembalikan io.EOF setelah sumber Anda habis. Anda dapat mengembalikannya sendiri atau bersama byte terakhir.
package main
import (
"fmt"
"io"
)
type oneShot struct{ done bool }
func (o *oneShot) Read(p []byte) (int, error) {
if o.done {
return 0, io.EOF
}
o.done = true
n := copy(p, []byte("once"))
return n, nil
}
func main() {
data, _ := io.ReadAll(&oneShot{})
fmt.Println(string(data))
}Membaca dari Irisan
Pembaca khusus dapat melacak posisi dalam data pendukung dan mengembalikan potongan pada setiap pemanggilan.
package main
import (
"fmt"
"io"
)
type sliceReader struct {
data []byte
pos int
}
func (s *sliceReader) Read(p []byte) (int, error) {
if s.pos >= len(s.data) {
return 0, io.EOF
}
n := copy(p, s.data[s.pos:])
s.pos += n
return n, nil
}
func main() {
r := &sliceReader{data: []byte("custom")}
out, _ := io.ReadAll(r)
fmt.Println(string(out))
}Pembaca yang Mentransformasi
Bungkus pembaca lain dan transformasikan byte secara langsung—di sini, setiap byte diubah menjadi huruf besar saat dialirkan.
package main
import (
"bytes"
"fmt"
"io"
)
type upper struct{ r io.Reader }
func (u upper) Read(p []byte) (int, error) {
n, err := u.r.Read(p)
for i := 0; i < n; i++ {
if p[i] >= 'a' && p[i] <= 'z' {
p[i] -= 32
}
}
return n, err
}
func main() {
out, _ := io.ReadAll(upper{r: bytes.NewReader([]byte("hello"))})
fmt.Println(string(out))
}Patuhi Panjang Penyangga
Jangan pernah menulis lebih dari len(p) byte. Gunakan copy(p, src) yang dibatasi oleh irisan yang lebih kecil, lalu kembalikan jumlah byte yang disalin.
Penerima Nilai vs Pointer
Jika pembaca Anda melacak posisi atau keadaan, gunakan penerima pointer agar perubahan tetap ada di antara pemanggilan. Pembaca tanpa keadaan dapat menggunakan penerima nilai.
Menyusun dengan Pembantu io
Karena tipe Anda memenuhi io.Reader, tipe tersebut dapat langsung digunakan dalam io.Copy, bufio.NewReader, io.LimitReader, dan lainnya.
package main
import (
"io"
"os"
)
type dots struct{ left int }
func (d *dots) Read(p []byte) (int, error) {
if d.left == 0 {
return 0, io.EOF
}
p[0] = '.'
d.left--
return 1, nil
}
func main() {
io.Copy(os.Stdout, &dots{left: 4})
os.Stdout.WriteString("\n")
}Kesalahan Umum
- Lupa mengembalikan
io.EOF(pembacaan tidak berakhir) - Menulis melewati
len(p) - Menggunakan penerima nilai untuk pembaca yang menyimpan keadaan
Mengapa Menggunakan Pembaca Khusus
Pembaca khusus memungkinkan Anda mengadaptasi sumber apa pun—pembangkit, dekoder, pembatas laju, dan aliran terenkripsi—ke dalam ekosistem I/O Go yang universal.
Pemeriksaan Singkat
Ujilah pengetahuan Anda tentang pembaca khusus.
Ringkasan
Anda telah mempelajari cara membangun aliran sendiri.
- Implementasikan
Read(p []byte) (int, error) - Gunakan
copydan patuhilen(p) - Kembalikan
io.EOFsetelah selesai - Gunakan penerima pointer untuk pembaca yang menyimpan keadaan
- Susun dengan semua pembantu io tanpa pekerjaan tambahan
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mengimplementasikan Reader Kustom” gratis?
Ya — teks lengkap “Mengimplementasikan Reader Kustom” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Go Academy, upgrade ke CoddyKit PRO. Kursus Go Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mengimplementasikan Reader Kustom”?
Bangun stream Anda sendiri Kamu berlatih Go Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai Go Academy?
Tidak diperlukan pengalaman sebelumnya. Go Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 4 dari 4.
Berapa lama pelajaran “Mengimplementasikan Reader Kustom” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran Go Academy ini?
Ya. Setiap pelajaran Go Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Interface Reader
- Interface Writer
- Fungsi Utilitas io
- Mengimplementasikan Reader Kustom