0Pricing
Go Academy · درس

واجهات مكتبة Go القياسية الأساسية

‏fmt.Stringer وio.Reader وio.Writer

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

fmt.Stringer

يحتوي fmt.Stringer على أسلوب واحد: String() string. نفّذه للتحكم في كيفية ظهور نوعك مع fmt.Println و%v:

package main
import "fmt"

type Color int
const (Red Color = iota; Green; Blue)
func (c Color) String() string {
    return []string{"Red","Green","Blue"}[c]
}

func main() {
    fmt.Println(Red, Green, Blue) // Red Green Blue
}

واجهة error

تحتوي واجهة error المضمّنة على أسلوب واحد: Error() string. ويمكن استخدام أي نوع ينفّذها كخطأ:

package main
import "fmt"

type ValidationError struct{ Field, Msg string }
func (e *ValidationError) Error() string {
    return e.Field + ": " + e.Msg
}

func validate(age int) error {
    if age < 0 { return &ValidationError{"age", "must be non-negative"} }
    return nil
}

func main() {
    fmt.Println(validate(-1))
}

io.Reader

يحتوي io.Reader على أسلوب واحد: Read(p []byte) (n int, err error). وتنفّذه الملفات وأجسام HTTP والسلاسل النصية والمخازن المؤقتة جميعًا:

package main
import ("fmt"; "strings")

func countBytes(r interface{ Read([]byte)(int,error) }) int {
    buf := make([]byte, 512)
    total := 0
    for {
        n, err := r.Read(buf)
        total += n
        if err != nil { break }
    }
    return total
}

func main() {
    r := strings.NewReader("hello world")
    fmt.Println(countBytes(r)) // 11
}

io.Writer

يحتوي io.Writer على أسلوب واحد: Write(p []byte) (n int, err error). ويُستخدم بواسطة fmt.Fprintf والتسجيل وكتّاب استجابات HTTP وغير ذلك:

package main
import ("bytes"; "fmt")

func main() {
    var buf bytes.Buffer
    fmt.Fprintf(&buf, "Hello, %s!", "Go")
    fmt.Println(buf.String()) // Hello, Go!
}

io.ReadWriter وio.Closer

تركّب المكتبة القياسية الواجهات الصغيرة في واجهات أكبر:

package main
import "io"

// io.ReadWriter = io.Reader + io.Writer
// io.ReadCloser = io.Reader + io.Closer
// io.ReadWriteCloser = all three

func process(rw io.ReadWriter) {
    buf := make([]byte, 8)
    rw.Read(buf)
    rw.Write(buf)
}

func main() { _ = process }

sort.Interface

تتطلب sort.Interface الأساليب Len() int وLess(i, j int) bool وSwap(i, j int):

package main
import ("fmt"; "sort")

type ByLength []string
func (b ByLength) Len() int           { return len(b) }
func (b ByLength) Less(i, j int) bool { return len(b[i]) < len(b[j]) }
func (b ByLength) Swap(i, j int)      { b[i], b[j] = b[j], b[i] }

func main() {
    fruits := ByLength{"banana","apple","kiwi"}
    sort.Sort(fruits)
    fmt.Println([]string(fruits)) // [kiwi apple banana]
}

http.Handler

يحتوي http.Handler على أسلوب واحد: ServeHTTP(ResponseWriter, *Request). وكل شيء في مكدس HTTP في Go مبني على هذه الواجهة الوحيدة:

package main
import ("fmt"; "net/http")

type Hello struct{}
func (h Hello) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello, World!")
}

func main() {
    http.ListenAndServe(":8080", Hello{})
}

fmt.GoStringer

نفّذ GoString() string للتحكم في تمثيل نوعك باستخدام %#v (بصيغة Go):

package main
import "fmt"

type Version struct{ Major, Minor int }
func (v Version) GoString() string {
    return fmt.Sprintf("Version{%d, %d}", v.Major, v.Minor)
}

func main() {
    fmt.Printf("%#v\n", Version{1, 18}) // Version{1, 18}
}

encoding.TextMarshaler

نفّذ MarshalText() ([]byte, error) وUnmarshalText([]byte) error لترميز النصوص المخصص (سلاسل JSON النصية وYAML وغير ذلك):

package main
import "fmt"

type Status int
const (Active Status = iota; Inactive)
func (s Status) MarshalText() ([]byte, error) {
    if s == Active { return []byte("active"), nil }
    return []byte("inactive"), nil
}

func main() {
    s := Active
    b, _ := s.MarshalText()
    fmt.Println(string(b)) // active
}

تركيب الواجهات القياسية

ادمج الواجهات القياسية باستخدام io.TeeReader وio.MultiWriter وغيرهما لإنشاء مسارات معالجة قوية دون كتابة أنواع جديدة:

package main
import ("bytes"; "fmt"; "io"; "strings")

func main() {
    r := strings.NewReader("hello")
    var buf bytes.Buffer
    tee := io.TeeReader(r, &buf)
    io.ReadAll(tee)
    fmt.Println(buf.String()) // hello
}

تحقّق سريع

ما الواجهة التي يجب أن ينفّذها النوع لكي يمكن استخدامه كخطأ في Go؟

مراجعة

أهم واجهات المكتبة القياسية:

  • fmt.Stringer — تمثيل مخصص عند الطباعة
  • error — قيم الأخطاء
  • io.Reader / io.Writer — عمليات الإدخال والإخراج المتدفقة
  • sort.Interface — الفرز المخصص
  • http.Handler — معالجة طلبات HTTP

مهمة تدريبية

نفّذ sort.Interface على []Person (حيث تحتوي Person على حقلي Name وAge) لفرز العناصر حسب العمر تنازليًا. اطبع القائمة بعد فرزها.

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

هل درس «واجهات مكتبة Go القياسية الأساسية» مجاني؟

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

ماذا ستتعلم في «واجهات مكتبة Go القياسية الأساسية»؟

‏fmt.Stringer وio.Reader وio.Writer تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

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

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

كم من الوقت يستغرق درس «واجهات مكتبة Go القياسية الأساسية»؟

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

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

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

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

  1. تعريف الواجهات وتنفيذها
  2. واجهات مكتبة Go القياسية الأساسية
  3. تأكيدات الأنواع وعبارات type switch
  4. تركيب الواجهات وأفضل الممارسات
← العودة إلى Go Academy