การใช้งานตัวอ่านแบบกำหนดเอง
สร้างสตรีมของคุณเอง
การใช้งานตัวอ่านแบบกำหนดเอง เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อินเทอร์เฟซ Reader
- อินเทอร์เฟซ Writer
- ฟังก์ชันอรรถประโยชน์ io
- การใช้งานตัวอ่านแบบกำหนดเอง