Multiple Return Values
Go bietet out-of-the-box ein Mittel damit Funktionen mehrere Werte zurückgeben können.
Im folgenden Code-Beispiel werden aus einer undefinierten Anzahl von Zahlen (variadic function) den kleinsten und grössten Wert ermittelt und entsprechend zurückgegeben. Auf Zeile 1 sticht die Definition mehrerer Rückgabetypen (int, int)
ins Auge.
func getMinMax(numbers ...int) (int, int) {
if len(numbers) == 0 {
return 0, 0;
}
var min = numbers[0]
var max = numbers[0]
for _, num := range numbers {
if num > max {
max = num;
}
if num < min {
min = num;
}
}
return min, max
}
Im folgenden Beispiel wird aufgezeigt, wie die beiden Werte mittels multiple assignment erhalten werden können. Falls man nur an einem Teil der Werte interessiert ist, kommt der alt bekannte blank identifier _
ins Spiel, denn in Case 2 ist man nur an max
interessiert.
func main() {
// Case 1
min, max := getMinMax(4, 9, 8, 12)
fmt.Println(min)
fmt.Println(max)
// Case 2
_, max = getMinMax(4, 9, 8, 12)
fmt.Println(max)
}
In Swift haben wir das Konstrukt Tuples kennen gelernt mit welchem man schlussendlich auch Funktionen realisieren kann, welches mehrere Rückgabewerte zulässt. In Go wird kein Extra-Konstrukt dafür gebraucht.
Fazit
Nettes Konstrukt und kann manchmal hilfreich sein. In Java muss man dafür extra einen Container bauen. Jedoch würde ich das nicht exzessiv nutzen. Es ist wie mit den formalen Parameter - in Clean Code wird davon gesprochen, dass die Anzahl der Parameter möglichst klein zu halten sind, damit die API nicht falsch bedient werden kann. Dasselbe ist hier der Fall, die Reihenfolge der Rückgabewerte ist relevant! Im Beispiel oben ist min und max schnell mal vertauscht.