دروس الوحدة (2/5)
عوائد متعددة وعوائد مسماة
في Go، يمكن للدالة إرجاع قيم متعددة. إنها الآلية التي
يمكّن النمط (value, error) الذي رأيته بالفعل والذي ينتشر
المكتبة القياسية بأكملها.
عوائد متعددة
تنتقل أنواع الإرجاع بين قوسين، مفصولة بفواصل:
func divmod(a, b int) (int, int) {
return a / b, a % b
}
q, r := divmod(17, 5) // q=3, r=2لقد تم تدميرها بمهام متعددة. للتخلص من أحد
تستخدم القيم _:
_, r := divmod(17, 5) // solo il restoالنمط (T, error) المتعارف عليه
يتبعه كل stdlib تقريبًا. error هو الأخير دائمًا:
func read(path string) ([]byte, error) {
data, err := os.ReadFile(path)
if err != nil {
return nil, fmt.Errorf("read %q: %w", path, err)
}
return data, nil
}العائدات المسماة
يمكنك تسمية القيم المرجعة: فهي تصبح متغيرات معلنة مسبقًا
تمت تهيئتها إلى الصفر، وreturn بدون أي وسائط تُرجعها ("naked
العودة"):
func divmod(a, b int) (q, r int) {
q = a / b
r = a % b
return // naked: ritorna q, r
}تظهر المرتجعات المسماة أيضًا في تلميحات أدوات التوثيق، لذا فهي مفيدة كشكل من أشكال التوثيق المضمّن للوظائف المعقدة — وليس فقط من أجل العودة العارية.
أكثر من عائدين؟
لا شيء يمنعك من (int, int, int, error)، إلا إذا شعرت بالحاجة
إنها دائمًا علامة على أنه يجب عليك إرجاع struct:
type Result struct {
Sum int
Avg float64
Max int
}
func analyze(nums []int) (Result, error) { ... }جربه
حدد divmod(a, b int) (int, int) الذي يُرجع القسمة والباقي.
إظهار التلميح
أنواع الإرجاع بين قوسين: `(int, int)`.
الحل متاح بعد 3 من المحاولات
قم بتنفيذ SafeDiv(a, b int) (int, error): if b == 0 return (0, error.New('divisione per Zero'))، وإلا (a/b, nil).
إظهار التلميح
الخطأ دائمًا هو القيمة الأخيرة. عند الخطأ: القيمة صفر + خطأ.
الحل متاح بعد 3 من المحاولات
ما الذي يطبعه هذا البرنامج باستخدام العوائد المسماة؟
func f() (a, b int) {
a = 1
b = 2
return
}
x, y := f()
fmt.Println(x, y)خلاصة
- قيم متعددة بين قوسين:
func f() (T1, T2, error). - الاتفاقية:
errorدائمًا كقيمة أخيرة؛ عند الخطأ، القيمة صفر + الخطأ. - تقوم عمليات الإرجاع المسماة بالإعلان المسبق عن المتغيرات وتمكين عمليات الإرجاع المجردة.
- إرجاعات عارية فقط في وظائف قصيرة جدًا؛ أبعد من ذلك، تعاني سهولة القراءة.
- أكثر من 2-3 عوائد؟ ربما تريد الهيكل.