0Pricing
Go Academy · บทเรียน

การใช้งานตัวอ่านแบบกำหนดเอง

สร้างสตรีมของคุณเอง

การใช้งานตัวอ่านแบบกำหนดเอง เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

สร้างสตรีมของคุณเอง

คุณสามารถสร้างแหล่งข้อมูลแบบกำหนดเองได้โดยทำให้อินเทอร์เฟซ io.Reader ซึ่งมีเพียงเมธอดเดียวใช้งานได้ จากนั้นชนิดข้อมูลของคุณจะทำงานร่วมกับตัวช่วยของ io ทุกตัวได้

เมธอดที่ต้องทำให้ใช้งานได้

ทำให้ชนิดข้อมูลของคุณมี Read(p []byte) (n int, err error) ให้เติมข้อมูลลงใน p ส่งกลับจำนวนข้อมูล และส่งกลับ io.EOF เมื่ออ่านเสร็จแล้ว

ตัวอ่านค่าคงที่

ตัวอย่างนี้เป็นตัวอ่านที่ส่งไบต์เดิมซ้ำไม่สิ้นสุด โดยจำกัดจำนวนด้วย 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))
}

การส่งสัญญาณ EOF

ส่งกลับ io.EOF เมื่ออ่านแหล่งข้อมูลจนหมดแล้ว คุณอาจส่งกลับเฉพาะค่านี้ หรือส่งกลับพร้อมไบต์ชุดสุดท้ายก็ได้

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))
}

การอ่านจากสไลซ์

ตัวอ่านแบบกำหนดเองสามารถติดตามตำแหน่งในข้อมูลต้นทาง และส่งกลับข้อมูลทีละส่วนในการเรียกแต่ละครั้ง

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))
}

ตัวอ่านที่แปลงข้อมูล

ห่อตัวอ่านอีกตัวหนึ่งแล้วแปลงไบต์ทันทีที่อ่าน ในตัวอย่างนี้คือการเปลี่ยนไบต์แต่ละตัวเป็นตัวพิมพ์ใหญ่ขณะสตรีม

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))
}

เคารพความยาวบัฟเฟอร์

อย่าเขียนเกิน len(p) ไบต์ ให้ใช้ copy(p, src) ซึ่งจำกัดจำนวนตามสไลซ์ที่สั้นกว่า แล้วส่งกลับจำนวนที่คัดลอก

ตัวรับค่าเทียบกับตัวรับพอยน์เตอร์

หากตัวอ่านของคุณติดตามตำแหน่งหรือสถานะ ให้ใช้ ตัวรับพอยน์เตอร์ เพื่อให้การเปลี่ยนแปลงคงอยู่ข้ามการเรียกแต่ละครั้ง ตัวอ่านที่ไม่มีสถานะสามารถใช้ตัวรับค่าได้

การประกอบด้วยตัวช่วยของ io

เนื่องจากชนิดข้อมูลของคุณสอดคล้องกับ io.Reader จึงนำไปใช้กับ io.Copy, bufio.NewReader, io.LimitReader และอื่น ๆ ได้ทันที

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")
}

ข้อผิดพลาดที่พบบ่อย

  • ลืมส่งกลับ io.EOF ทำให้อ่านไม่สิ้นสุด
  • เขียนเกิน len(p)
  • ใช้ตัวรับค่าให้กับตัวอ่านที่มีสถานะ

เหตุผลที่ใช้ตัวอ่านแบบกำหนดเอง

ตัวอ่านเหล่านี้ช่วยให้คุณปรับแหล่งข้อมูลใด ๆ เช่น ตัวสร้าง ตัวถอดรหัส ตัวจำกัดอัตรา และสตรีมเข้ารหัส ให้เข้ากับระบบนิเวศ I/O สากลของ Go ได้

ตรวจสอบอย่างรวดเร็ว

ทดสอบความรู้เกี่ยวกับตัวอ่านแบบกำหนดเอง

สรุป

คุณได้เรียนรู้การสร้างสตรีมของตนเองแล้ว

  • ทำให้ Read(p []byte) (int, error) ใช้งานได้
  • ใช้ copy และเคารพ len(p)
  • ส่งกลับ io.EOF เมื่ออ่านเสร็จแล้ว
  • ใช้ตัวรับพอยน์เตอร์สำหรับตัวอ่านที่มีสถานะ
  • ประกอบเข้ากับตัวช่วยของ io ทั้งหมดได้ทันที

คำถามที่พบบ่อย

บทเรียน “การใช้งานตัวอ่านแบบกำหนดเอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การใช้งานตัวอ่านแบบกำหนดเอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การใช้งานตัวอ่านแบบกำหนดเอง”

สร้างสตรีมของคุณเอง คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การใช้งานตัวอ่านแบบกำหนดเอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม

ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. อินเทอร์เฟซ Reader
  2. อินเทอร์เฟซ Writer
  3. ฟังก์ชันอรรถประโยชน์ io
  4. การใช้งานตัวอ่านแบบกำหนดเอง
← กลับไปที่ Go Academy