خذ بعين الاعتبار وظيفتين من حزمة الشرائح التجريبية: تحتوي على وتنمو. تقبل كلتا الدالتين وسيطات الشريحة، ولكن مع قيود نوع مختلفة:
الوسيطة الأولى لـ يحتوي على النوع []E، حيث يكون E مقيدًا بالقابل للمقارنة، مما يشير إلى أن E يجب أن يكون قابلاً للمقارنة . من ناحية أخرى، تحتوي الوسيطة الأولى لـ Grow على النوع S، مقيد بـ ~[]E، مما يشير إلى أن S يجب أن يحتوي على نوع أساسي يمثل شريحة من E.
للوهلة الأولى، قد يبدو أنه لا يوجد فرق عملي بين استخدام هذين النوعين من القيود. ومع ذلك، ليس هذا هو الحال عندما تحتاج إلى إرجاع شريحة من نفس نوع الوسيطة في Grow.
إذا كنت بحاجة إلى العودة شريحة من نفس نوع وسيطة الإدخال، يجب عليك استخدام معلمة نوع تقيد نفسها بالشريحة (على سبيل المثال، ~[]E). يسمح هذا للدالة بإرجاع قيمة من نفس نوع الوسيطة.
لنفكر في تطبيقين لـ Grow:
func Grow[S ~[]E, E any](s S, n int) S // Grow returns a slice of the same type as s func Grow2[E any](s []E, n int) []E // Grow2 returns a slice of type []E
عند تمرير شريحة من نوع مخصص مع شريحة كنوع أساسي لها يمكن لـ Grow إرجاع قيمة من نفس النوع، بينما لا يمكن لـ Grow2 ذلك. يمكن لـ Grow2 فقط إرجاع قيمة من نوع شريحة غير مسمى، []E.
type ints []int // user-defined slice type ints x := []int{1} // initialize a slice x of type []int x2 := Grow(x, 10) // x2 will be of type []int y := ints{1} // initialize a slice y of type ints y2 := Grow(y, 10) // y2 will be of type ints
هنا، Grow2(y, 10) يتلقى قيمة من النوع ints لكنه يُرجع قيمة من النوع []int، وهي ليست كذلك السلوك المقصود.
في الختام، عندما يتطلب استدعاء الوظيفة إرجاع شريحة من نفس النوع (ربما يكون مسمى) مثل الوسيطة، باستخدام تعد معلمة النوع التي تقيد نفسها بالشريحة (~[]E) ضرورية. بخلاف ذلك، يمكن استخدام معلمة النوع التي تقيد نوع العنصر فقط (E أي).
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3