إن عدم القدرة على تحويل شرائح من أنواع مختلفة، كما هو موضح في مقتطف التعليمات البرمجية المقدم، يرجع إلى تحويل نوع معين القواعد الموضحة في مواصفات Go. تتحكم هذه القواعد عندما يمكن تحويل قيمة غير ثابتة إلى نوع معين.
لا تنطبق أي من قواعد التحويل على الحالة التي تحاول فيها تحويل شريحة من Bar إلى شريحة من Foo. في حين أن الأنواع الأساسية من Foo وBar متطابقة، فإن الأنواع الأساسية للشرائح الخاصة بها ليست كذلك. يؤدي هذا إلى عدم القدرة على تعيين قيمة []Foo لمتغير من النوع []Bar.
فهم الأنواع الأساسية
من المهم ملاحظة أن الأساس فنوع المتغير ليس بالضرورة نفس نوع المتغير نفسه. في حالة الشرائح، نوع العنصر هو النوع الأساسي. وبالتالي، في حين أن Foo وBar لهما نفس النوع الأساسي (Foo)، فإن []Foo و[]Bar ليس لهما نفس النوع.
حل عملي
لمعالجة هذه المشكلة ، يمكنك إنشاء نوع وسيط يطلق على Bar اسم مستعار Foo. يعمل هذا الأسلوب لأن نوع عنصر الشريحة يظل كما هو. على سبيل المثال:
type Foo struct { A int }
type Bar Foo
type Foos []Foo
type Bars Foos
func main() {
foos := []Foo{Foo{1}, Foo{2}}
bars := Bars(foos)
fmt.Println(bars)
}
الإخراج:
[{1} {2}]
يقوم هذا الحل بإنشاء شرائح بنفس نوع العنصر الأساسي، مما يسمح بالتحويل بينها.
اعتبارات غير آمنة
كملاحظة للتحذير، في حين أنه من الممكن تقنيًا "عرض" شريحة من Foo كشريحة من Bar باستخدام غير آمن العمليات، وهذا النهج يتحايل على سلامة النوع. من المستحسن استخدام أسلوب الاسم المستعار للنوع الموضح أعلاه من أجل السلامة والموثوقية.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3