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
দুই-মানের অ্যাসাইনমেন্ট প্যাটার্ন error হ্যান্ডলিংয়ের বাইরেও দেখা যায়।
ম্যাপ লুকআপ, টাইপ অ্যাসারশন আর চ্যানেল রিসিভ সবই সফলতা বা ডেটার উপস্থিতি বোঝাতে একটি দ্বিতীয় বুলিয়ান মান ব্যবহার করে, যা প্রথা অনুযায়ী 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 দেখুন।