لا يتم عرض مثيلات الخطأ على أنها لا شيء
في فهم مقارنات الواجهات، من المهم إدراك أنها تقوم بتقييم كل من النوع والقيمة.
ضع في اعتبارك مقتطف الكود:
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