واجهات مكتبة 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 يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف الواجهات وتنفيذها
- واجهات مكتبة Go القياسية الأساسية
- تأكيدات الأنواع وعبارات type switch
- تركيب الواجهات وأفضل الممارسات