Variantenfunktionen in Go

Von Clockbirds verblassen



Das Team von Mail.ru Cloud Solutions hateinen Artikel über verschiedene Funktionen in Go übersetzt. Der Autor erklärt, wie sich verschiedene Funktionen von normalen Funktionen unterscheiden und wie sie erstellt werden.



Was ist eine variable Funktion?



Eine Funktion ist ein Code, der zur Ausführung einer bestimmten Aufgabe entwickelt wurde. Der Funktion werden ein oder mehrere Argumente übergeben, und sie gibt ein oder mehrere Ergebnisse zurück.



Variantenfunktionen sind dieselben wie reguläre Funktionen , können jedoch eine unendliche oder variable Anzahl von Argumenten annehmen.



func f(elem ...Type)


Dies ist eine typische Variadic-Funktionssyntax. Der Operator ..., auch als Boxoperator bezeichnet, weist Go an, alle Typargumente Typein einem Parameter zu speichern elem. Mit anderen Worten, Go erstellt eine Variable elemmit einem Typ []Type, dh einem Slice. Alle an die Funktion übergebenen Argumente werden im Slice gespeichert elem.



Sehen wir uns ein Beispiel für eine Funktion an append().



append([]Type, args, arg2, argsN)


Die Funktion appenderwartet, dass das erste Argument ein Slice vom Typ ist, Typegefolgt von einer beliebigen Anzahl von Argumenten. Aber wie fügt man einem Slice s2ein Slice hinzu s1?



Aus der Definition der Funktion append()folgt, dass wir nicht zwei Slices an sie übergeben können - es gibt Typenur ein Typargument . Daher verwenden wir den Unboxing-Operator ..., um das Slice in eine Reihe von Argumenten zu entpacken. Sie können dann an die Funktion übergeben werden append.



append(s1, s2...)


...bezeichnen sowohl den Verpackungsbetreiber als auch den Auspackbetreiber. Der Unboxing-Operator wird immer nach dem Variablennamen angezeigt.



In unserem Beispiel die Slices s1und s2der gleiche Typ. Wir kennen normalerweise die Parameter einer Funktion und die Anzahl der Argumente, die sie benötigt. Woher weiß eine Funktion accept, wie viele Parameter an sie übergeben wurden?



Wenn Sie sich die Funktionsdeklaration ansehen append, können Sie den Ausdruck sehen elems ...Type. Es packt alle Argumente, beginnend mit dem zweiten, in ein Slice elems.



func append(slice []Type, elems ...Type) []Type


Nur das letzte Argument in einer Funktionsdeklaration kann variadisch sein.



Daher ist das erste Argument für die Funktion appendnur ein Slice, da es als Slice definiert ist. Alle nachfolgenden Argumente werden in ein Argument mit dem Namen gepackt elems.



Nun wollen wir sehen, wie Sie Ihre eigene Variadic-Funktion erstellen.



So erstellen Sie eine variable Funktion



Wie oben erwähnt, ist eine variadische Funktion eine reguläre Funktion, die eine variable Anzahl von Argumenten akzeptiert. Dazu müssen Sie den Boxoperator verwenden ...Type.



Schreiben wir eine Funktion getMultiplesmit einem Argument vom ersten factorTyp int(Multiplikationsfaktor) und einer variablen Anzahl zusätzlicher Typargumente int. Sie werden in eine Scheibe verpackt args.



Verwenden Sie diese Option, makeum ein leeres Slice zu erstellen. Es hat dieselbe Größe wie das Slice args. for rangeMultiplizieren Sie die Slice-Elemente argsmit einer Schleife mit factor. Wir setzen das Ergebnis in ein neues leeres Slice multiples, das wir als Ergebnis der Funktion zurückgeben.



func getMultiples(factor int, args ...int) []int {
	multiples := make([]int, len(args))
	for index, val := range args {
		multiples[index] = val * factor
	}
	return multiples
}


Dies ist eine sehr einfache Funktion, wenden Sie sie innerhalb eines Blocks an main().



func main() {
	s := []int{10, 20, 30}
	mult1 := getMultiples(2, s...)
	mult2 := getMultiples(3, 1, 2, 3, 4)
	fmt.Println(mult1)
	fmt.Println(mult2)
}




https://play.go.org/p/BgU6H9orhrn



Was passiert, wenn Sie im obigen Beispiel die Slice sgetMultiplesals zweites Argumentan die Funktion übergeben? Der Compiler meldet einen Fehler: Im ArgumentgetMultipleskann er nichts (type [] int)als Typ verwendet werdenint. Dies liegt daran, dass das Slice einen Typ hat, von dem[]int, getMultiplesParameter erwartet werdenint.



Wie ein Slice an eine Variadic-Funktion übergeben wird



Slice ist eine Referenz auf ein Array. Was passiert also, wenn Sie mit dem Unboxing-Operator ein Slice an eine Variadic-Funktion übergeben? Erstellt Go ein neues Slice argsoder verwendet es ein altes Slice s?



Da wir keine Vergleichstools haben args == s, müssen wir das Slice ändern args. Dann finden wir heraus, ob sich das ursprüngliche Slice geändert hat s.





https://play.go.org/p/fbNgVGu6JZO



Im obigen Beispiel haben wir die Funktion geringfügig geändert getMultiples. Anstatt ein neues Slice zu erstellen, weisen wir die Berechnungsergebnisse den Elementen des Slice zu argsund ersetzen die eingehenden Elemente durch die multiplizierten Elemente.



Als Ergebnis sehen wir, dass die Werte des ursprünglichen Slicesgeändert haben. Wenn Sie Argumente über den Unboxing-Operator an die Variadic-Funktion übergeben, verwendet Go Verweise auf das dem Original zugrunde liegende Datenarray, um ein neues Slice zu erstellen. Achten Sie darauf, keinen Fehler zu machen, da sich sonst die Originaldaten aufgrund von Berechnungen ändern.



Viel Glück!



Was noch zu lesen:



  1. Go und CPU-Caches
  2. Warum ein Backend-Entwickler die Programmiersprache Go lernen sollte
  3. Unser Telegrammkanal zur digitalen Transformation



All Articles