مسیر
/
Go
Go
/
برنامه‌ی درسی
/
مقادیر بازگشتی چندگانه
مق

مقادیر بازگشتی چندگانه در Go

{one: "۱ تمرین", other: "%{count} تمرین"}

درباره‌ی مقادیر بازگشتی چندگانه

توابع و متدهای Go می‌توانند چندین مقدار بازگردانند:

func GetCard() (Card, error) { ... }

هر مقدار بازگشتی باید به ترتیب انتساب داده شود و با کاما از هم جدا شوند:

card, err := GetCard()

شناسه‌ی خالی

هر جایگاه در این انتساب یک متغیر تعریف می‌کند. در Go تعریف یک متغیر بدون استفاده از آن مجاز نیست. برای رد کردن آن مقدار بازگشتی، به جای اسم متغیر از شناسه‌ی خالی _ استفاده کنید.

card, _ := GetCard() // error intentionally ignored
_, err := GetCard()  // card ignored, only checking for error

مدیریت خطا

error یک «رابط» توکار است. خطای nil یعنی هیچ خطایی رخ نداده است؛ هر مقدار غیر از nil یعنی چیزی اشتباه پیش رفته است. طبق قرارداد، توابعی که ممکن است شکست بخورند باید error را به عنوان آخرین مقدار خود بازگردانند. فراخوانی‌کننده باید پیش از استفاده از دیگر مقادیر بازگشتی آن را بررسی کند:

card, err := GetCard()
if err != nil {
    // unsafe to use card here
    return err
}
// safe to use card here

اصطلاح کاما-ok

الگوی انتساب دومقداری در بیرون از مدیریت خطا هم ظاهر می‌شود. جست‌وجو در نقشه، تأیید نوع و دریافت از کانال همگی از یک مقدار منطقی دوم استفاده می‌کنند که طبق قرارداد ok نامیده می‌شود تا موفقیت یا وجود داده را نشان دهد:

m := map[string]int{"a": 1}
v, ok := m["a"] // ok is true
v, ok = m["z"]  // ok is false
var i interface{} = "hello"
v, ok := i.(string) // ok is true
v, ok = i.(int)     // ok is false
v, ok := <-ch // ok is false if ch is closed and empty

مقادیر بازگشتی نام‌گذاری‌شده

مقادیر بازگشتی را هم می‌توان در امضای تابع نام داد. این متغیرها سپس درون بدنه‌ی تابع قابل دسترسی هستند.

func divide(a, b int) (quotient, remainder int) {
    quotient = a / b
    remainder = a % b
    return quotient, remainder
}

مقادیر بازگشتی نام‌گذاری‌شده معنای هر جایگاه بازگشت را مستند می‌کنند. می‌توان از آن‌ها همراه با یک «بازگشت برهنه»، یعنی بازگشتی که بدون مقدار نوشته می‌شود، هم استفاده کرد. بازگشت‌های برهنه به‌طور ضمنی مقادیر کنونی متغیرهای نام‌گذاری‌شده را بازمی‌گردانند:

func split(sum int) (x, y int) {
    x = sum * 4 / 9
    y = sum - x
    return
}

در توابع بلندتر، بازگشت‌های برهنه اغلب خوانایی را کاهش می‌دهند، چون مشخص نیست چه چیزی بازگردانده می‌شود. مگر اینکه تابع آن‌قدر کوتاه باشد که امضا همیشه در دید باشد، مقادیر بازگشتی صریح را ترجیح دهید.

برای یادگیری بیشتر، Go by Example: Multiple Return Values، Effective Go: Multiple Returns یا Tour of Go را ببینید.

ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود