"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا لا يمكن مقارنة مثيل الخطأ الصفري بالصفر؟

لماذا لا يمكن مقارنة مثيل الخطأ الصفري بالصفر؟

تم النشر بتاريخ 2025-01-15
تصفح:565

Why Does a Nil Error Instance Not Compare as Nil?

لا يتم عرض مثيلات الخطأ على أنها لا شيء

في فهم مقارنات الواجهات، من المهم إدراك أنها تقوم بتقييم كل من النوع والقيمة.

ضع في اعتبارك مقتطف الكود:

type Goof struct {}

func (goof *Goof) Error() string {
    return fmt.Sprintf("I'm a goof")
}

func TestError(err error) {
    if err == nil {
        fmt.Println("Error is nil")
    } else {
        fmt.Println("Error is not nil")
    }
}

func main() {
    var g *Goof // nil
    TestError(g) // expect "Error is nil"
}

هنا، نتوقع أن "الخطأ ليس صفرًا" نظرًا لأن g صفر. ومع ذلك، بسبب مقارنات الواجهة، نحصل على "خطأ لا شيء". وذلك لأن (*Goof)(nil) له نوع مختلف عن error(nil).

لحل هذه المشكلة، يمكنك الإعلان عن خطأ var err بدلاً من var g *Goof. وبدلاً من ذلك، إذا قامت وظيفتك بإرجاع خطأ، فما عليك سوى إرجاع nil.

لمزيد من التوضيح، تتحقق مقارنات الواجهات مما إذا كانت الأنواع متطابقة، وليس إذا كان النوع يطبق واجهة. على هذا النحو، يوضح المثال التالي أنه حتى الواجهات غير الصفرية التي تحتوي على نفس البيانات الأساسية يمكن مقارنتها بأنها غير متكافئة بسبب الأنواع المختلفة:

package main

import "fmt"

type Bob int

func main() {
    var x int = 3
    var y Bob = 3
    var ix, iy interface{} = x, y
    fmt.Println(ix == iy)
}
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3