0Pricing
Go Academy · درس

القارئات ذات التخزين المؤقت

اقرأ بكفاءة باستخدام bufio

القارئات ذات التخزين المؤقت درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.

لماذا تُجرى عمليات القراءة باستخدام المخزن المؤقت

تؤدي قراءة بايت واحد في كل مرة من ملف أو من الشبكة إلى تشغيل استدعاء نظام في كل مرة. وهذا بطيء.

تغلف الحزمة bufio القارئ وتقرأ البيانات على دفعات كبيرة في مخزن مؤقت داخل الذاكرة، ثم تخدم عمليات القراءة الصغيرة من ذلك المخزن.

  • عدد أقل من استدعاءات النظام
  • سرعة أعلى بكثير عند إجراء عمليات قراءة صغيرة عديدة

إنشاء bufio.Reader

غلّف أي io.Reader باستخدام bufio.NewReader. نغلف هنا strings.Reader.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("Hello, Go!"))
	fmt.Printf("buffered reader ready: %T\n", r)
}

قراءة البايتات

تعيد ReadByte البايت المفرد التالي. ويُخدَم هذا البايت من المخزن المؤقت، وليس من خلال استدعاء نظام جديد.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("Go"))
	b1, _ := r.ReadByte()
	b2, _ := r.ReadByte()
	fmt.Printf("%c%c\n", b1, b2)
}

ReadString حتى محدِّد

تقرأ ReadString(delim) حتى أول ظهور لبايت المحدِّد، وتعيد كل شيء بما في ذلك المحدِّد.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("first,second,third"))
	part, _ := r.ReadString(',')
	fmt.Printf("%q\n", part)
}

إلقاء نظرة مسبقة

تعيد Peek(n) البايتات التالية وعددها n من دون استهلاكها. وهذا مفيد جدًا لتحديد طريقة التحليل قبل الالتزام بها.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("HTTP/1.1"))
	head, _ := r.Peek(4)
	fmt.Printf("starts with: %s\n", head)
}

حجم المخزن المؤقت

تحدد bufio.NewReaderSize(r, size) سعة المخزن المؤقت. يعني المخزن الأكبر عمليات قراءة أقل من المصدر الأساسي، لكنه يستهلك ذاكرة أكبر.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReaderSize(strings.NewReader("data"), 4096)
	fmt.Println("buffer size:", r.Size())
}

ReadLine مقارنةً بـ ReadString

تُبقي ReadString('\n') على محرف السطر الجديد؛ ويفضل كثير من محللات البيانات إزالة هذا المحرف. تتولى Scanner (في الدرس التالي) ذلك تلقائيًا.

استخدم ReadString عندما تحتاج إلى تحكم كامل في المحدِّدات.

معالجة io.EOF

عند استنفاد التدفق الأساسي، تعيد أساليب القراءة io.EOF. تحقق منه دائمًا لمعرفة وقت التوقف.

package main

import (
	"bufio"
	"fmt"
	"io"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("ab"))
	for {
		c, err := r.ReadByte()
		if err == io.EOF {
			break
		}
		fmt.Printf("%c", c)
	}
	fmt.Println()
}

استخدام ReadRune مع Unicode

تفكك ReadRune ترميز rune كاملًا بتنسيق UTF-8، وقد يمتد هذا الترميز عبر عدة بايتات. استخدمها مع النصوص التي تحتوي على محارف غير ASCII.

package main

import (
	"bufio"
	"fmt"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("héllo"))
	for {
		ru, _, err := r.ReadRune()
		if err != nil {
			break
		}
		fmt.Printf("%c ", ru)
	}
	fmt.Println()
}

القراءة حتى الانتهاء

من الأنماط الشائعة تكرار استدعاء ReadString حتى الوصول إلى EOF لمعالجة التدفق سطرًا سطرًا مع الحفاظ على تحكم دقيق.

package main

import (
	"bufio"
	"fmt"
	"io"
	"strings"
)

func main() {
	r := bufio.NewReader(strings.NewReader("a\nb\nc\n"))
	for {
		line, err := r.ReadString('\n')
		fmt.Print("got: " + line)
		if err == io.EOF {
			break
		}
	}
}

متى تستخدم bufio.Reader

  • لتغليف المصادر البطيئة مثل الملفات والمقابس
  • عند إجراء عمليات قراءة صغيرة عديدة
  • عند الحاجة إلى إلقاء نظرة مسبقة أو القراءة حسب محدِّد أو rune

لإجراء مسح بسيط سطرًا سطرًا، يُفضّل استخدام bufio.Scanner (في الدرس التالي).

اختبار سريع

اختبر مدى فهمك للقارئات ذات التخزين المؤقت.

مراجعة

تعلمت كيف تقلل bufio.Reader عدد استدعاءات النظام من خلال التخزين المؤقت.

  • تغلف NewReader وNewReaderSize كائنًا من نوع io.Reader
  • تخدم ReadByte وReadRune وReadString البيانات من المخزن المؤقت
  • تُلقي Peek نظرة مسبقة من دون استهلاك البيانات
  • توقف عند io.EOF

الأسئلة الشائعة

هل درس «القارئات ذات التخزين المؤقت» مجاني؟

نعم — نص درس «القارئات ذات التخزين المؤقت» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.

ماذا ستتعلم في «القارئات ذات التخزين المؤقت»؟

اقرأ بكفاءة باستخدام bufio تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟

لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «القارئات ذات التخزين المؤقت»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟

نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. القارئات ذات التخزين المؤقت
  2. الماسحات
  3. الكتّاب ذوو التخزين المؤقت
  4. تدفّق الملفات الكبيرة
← العودة إلى Go Academy