Go Academy · درس

تأكيدات الأنواع وعبارات type switch

تأكيدات الأنواع الآمنة وأنماط switch

الدرس 3 من 413 خطوة

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

تأكيدات النوع

تستخرج تأكيدات النوع القيمة الملموسة من الواجهة. وتكون الصيغة x.(T):

package main
import "fmt"

func main() {
    var i interface{} = "hello"
    s := i.(string)          // panics if wrong type
    fmt.Println(s, len(s))   // hello 5
}

تأكيد آمن بقيمتين

استخدم صيغة comma-ok لتجنّب حالات الذعر عند وجود أنواع خاطئة:

package main
import "fmt"

func main() {
    var i interface{} = 42
    s, ok := i.(string)
    fmt.Println(s, ok)  // "" false
    n, ok := i.(int)
    fmt.Println(n, ok)  // 42 true
}

مفتاح تبديل النوع

يقارن مفتاح تبديل النوع النوع الديناميكي لقيمة واجهة بعدة أنواع:

package main
import "fmt"

func describe(i interface{}) string {
    switch v := i.(type) {
    case int:    return fmt.Sprintf("int: %d", v)
    case string: return fmt.Sprintf("string: %q", v)
    case bool:   return fmt.Sprintf("bool: %v", v)
    default:     return fmt.Sprintf("unknown: %T", v)
    }
}

func main() {
    fmt.Println(describe(42))
    fmt.Println(describe("hi"))
    fmt.Println(describe(3.14))
}

مفتاح تبديل النوع على error

تكون مفاتيح تبديل النوع مفيدة خصوصًا لتصنيف الأخطاء:

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

type NotFoundError struct{ Name string }
func (e *NotFoundError) Error() string { return e.Name + " not found" }

type PermError struct{}
func (e *PermError) Error() string { return "permission denied" }

func handle(err error) {
    switch e := err.(type) {
    case *NotFoundError: fmt.Println("missing:", e.Name)
    case *PermError:     fmt.Println("perm error")
    default:             fmt.Println("other:", e)
    }
}

func main() {
    handle(&NotFoundError{"user"})
    handle(errors.New("generic"))
}

التأكيد على واجهة

يمكنك التأكيد على نوع واجهة آخر، وليس على الأنواع الملموسة فقط. ويفيد ذلك في التحقق مما إذا كان الكائن يدعم سلوكًا اختياريًا:

package main
import "fmt"

type Flusher interface{ Flush() }

type Writer interface{ Write(string) }

type BufferedWriter struct{ buf string }
func (b *BufferedWriter) Write(s string) { b.buf += s }
func (b *BufferedWriter) Flush()         { fmt.Println(b.buf); b.buf = "" }

func maybeFlush(w Writer) {
    if f, ok := w.(Flusher); ok { f.Flush() }
}

func main() {
    bw := &BufferedWriter{}
    bw.Write("hello")
    maybeFlush(bw)
}

تأكيد واجهة nil

يؤدي إجراء تأكيد على واجهة nil إلى حالة ذعر. احرص دائمًا على أن تكون الواجهة غير nil قبل إجراء التأكيد:

package main
import "fmt"

func safePrint(i interface{}) {
    if i == nil {
        fmt.Println("nil")
        return
    }
    fmt.Printf("%T: %v\n", i, i)
}

func main() {
    safePrint(nil)
    safePrint(42)
}

بديل reflect.TypeOf

لطباعة النوع دون إجراء تأكيد، استخدم fmt.Sprintf("%T", v) أو reflect.TypeOf(v):

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

func main() {
    v := []int{1, 2, 3}
    fmt.Printf("%T\n", v)             // []int
    fmt.Println(reflect.TypeOf(v))    // []int
}

تأكيد النوع مقابل تحويل النوع

تأكيد النوع: استخراج النوع الملموس من واجهة. تحويل النوع: تغيير نوع ملموس إلى نوع آخر متوافق. هاتان عمليتان مختلفتان:

package main
import "fmt"

func main() {
    var i interface{} = int32(5)
    n := i.(int32)          // assertion — OK
    big := int64(n)         // conversion — OK
    fmt.Println(n, big)
}

نمط comma-ok في select

يعمل نمط comma-ok أيضًا عند الاستلام من القنوات لاكتشاف القناة المغلقة. وتُستخدم الصياغة المختصرة نفسها باستمرار في Go.

متى تستخدم مفاتيح تبديل النوع

حالات الاستخدام الشائعة:

  • إلغاء تسلسل JSON مع حقول interface{}
  • تصنيف الأخطاء
  • توجيه رسائل البروتوكول
  • التحقق الاختياري من الواجهات (Flusher وCloser وغيرهما)

تحقق سريع

ما نتيجة تأكيد النوع غير الآمن الفاشل؟

مراجعة

أهم النقاط:

  • يتسبب x.(T) في panic عند النوع الخاطئ؛ أما x, ok := x.(T) فهو آمن
  • تتعامل مفاتيح تبديل النوع مع أنواع متعددة بوضوح
  • أكّد النوع إلى واجهات للتحقق من الإمكانات الاختيارية
  • لا تؤكّد النوع مطلقًا على واجهة nil

مهمة تدريبية

اكتب دالة sum(values []any) float64 تستخدم مفتاح تبديل النوع للتعامل مع قيم int وfloat64 وstring (مع تحليل السلسلة النصية)، وتتخطى القيم الأخرى.

البدء مجانًا

تعلم Go مع معلم ذكاء اصطناعي — مجانًا

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

الدورات
51
الدروس
203

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

هل درس «تأكيدات الأنواع وعبارات type switch» مجاني؟

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

ماذا ستتعلم في «تأكيدات الأنواع وعبارات type switch»؟

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

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

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

كم من الوقت يستغرق درس «تأكيدات الأنواع وعبارات type switch»؟

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

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

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

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

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