0Pricing
Go Academy · Pelajaran

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 copy dan patuhi len(p)
  • Kembalikan io.EOF setelah 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

  1. Interface Reader
  2. Interface Writer
  3. Fungsi Utilitas io
  4. Mengimplementasikan Reader Kustom
← Kembali ke Go Academy