Οι συναρτήσεις και οι μέθοδοι στη 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.
Οι αναζητήσεις σε map, οι ισχυρισμοί τύπου και οι λήψεις από channel χρησιμοποιούν όλες μια δεύτερη τιμή boolean, με την ετικέτα 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.