تنفيذ قارئات مخصّصة
أنشئ التدفقات الخاصة بك
تنفيذ قارئات مخصّصة درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 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) - استخدام مستقبِل قيمة مع القرّاء الذين يحتفظون بحالة
لماذا نستخدم القرّاء المخصصين
تتيح لك هذه القرّاء تكييف أي مصدر، مثل المولّدات وفاكّات الترميز ومحدّدات المعدل والتدفقات المشفّرة، مع منظومة Go العامة للإدخال والإخراج.
تحقق سريع
اختبر معرفتك بالقرّاء المخصصين.
مراجعة
تعلمت إنشاء تدفقاتك الخاصة.
- طبّق
Read(p []byte) (int, error) - استخدم
copyواحترمlen(p) - أعد
io.EOFعند الانتهاء - استخدم مستقبِل مؤشّر مع القرّاء الذين يحتفظون بحالة
- ركّبها مع جميع أدوات io المساعدة تلقائيًا
الأسئلة الشائعة
هل درس «تنفيذ قارئات مخصّصة» مجاني؟
نعم — نص درس «تنفيذ قارئات مخصّصة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «تنفيذ قارئات مخصّصة»؟
أنشئ التدفقات الخاصة بك تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تنفيذ قارئات مخصّصة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- واجهة Reader
- واجهة Writer
- دوال الأداة io
- تنفيذ قارئات مخصّصة