2016-04-01 4 views
3

Die Funktion ist make wie folgt beschreiben:Wie kann die Golang-Make-Funktion drei Parameter annehmen?

func make(Type, size IntegerType) Type 

Wenn wir make zum Schneiden verwenden manchmal zeigt es wie:

make([]int, 0, 10) 

Also meine Frage ist:

Wie kann die make Funktion übernehmen drei Parameter? Die size IntegerType ist nicht Vararg. Ich bin verwirrt ...

Antwort

0

Die Funktion makeis a builtin function. Die Funktion verfügt über einige Funktionen, die für andere Funktionen nicht verfügbar sind. Eine ist, dass es eine Variable Anzahl Argumente wie Sie notiert. Ein anderes ist, dass das erste Argument ein Typ ist.

Die function definition func make(Type, size IntegerType) Type dient nur zu Dokumentationszwecken. Es ist nicht die tatsächliche Definition der Funktion.

1

Die make() Funktion ist keine reguläre Funktion, sondern eine eingebaute Funktion, die Teil der Sprachspezifikation ist. Was Sie im builtin Paket (builtin.make()) sehen, dient nur zu Dokumentationszwecken. Das ist nicht die eigentliche Signatur der Funktion. Der dritte optionale Parameter ist die Kapazität, die nur zur Verfügung gestellt werden kann, wenn Sie ein Segment erstellen.

Es ist in der Spezifikation beschrieben: Making slices, maps and channels:

make(T, n)  slice  slice of type T with length n and capacity n 
make(T, n, m) slice  slice of type T with length n and capacity m 

Und bei Slice types:

erwähnte auch

Ein neuer, initialisiert Scheibe Wert für ein Element vom Typ gegeben T wird unter Verwendung der integrierten Funktion gemacht make , die einen Slice-Typ und Parameter mit der Länge und optional die Kapazität übernimmt. Ein Slice, der mit make erstellt wird, weist immer ein neues, verstecktes Array zu, auf das sich der zurückgegebene Slice-Wert bezieht. Das heißt, die Ausführung

make([]T, length, capacity) 

derselben Schicht erzeugt als Array Aufteilung und Aufschneiden es, so dass diese beiden Ausdrücke sind äquivalent:

make([]int, 50, 100) 
new([100]int)[0:50] 
5

make Die Funktion ist eine von einer Reihe von integrierten in Funktionen, die Dinge tun dürfen, die Sie in Ihrem Go-Code nicht (zumindest nicht sauber und leicht) erreichen können. Es hat eine Reihe von überladenen Formen für die Erstellung von Karten, Kanäle und Scheiben (siehe https://golang.org/ref/spec#Making_slices_maps_and_channels):

Ihre Verwirrung stammt wahrscheinlich aus https://golang.org/pkg/builtin/#make die make zeigt als func make(Type, size IntegerType) Type die Signatur aufweist. Wenn Sie in diesem Abschnitt näher betrachten, würden Sie auch einen Hinweis darauf, dass make ein drittes Argument haben:

Scheibe: Die Größe gibt die Länge. Die Kapazität der Scheibe ist gleich ihrer Länge.Ein zweites ganzzahliges Argument kann bereitgestellt werden, um eine andere Kapazität anzugeben; es muss als die Länge nicht kleiner sein, so machen ([] int, 0, 10) weist eine Scheibe der Länge 0 und Kapazität 10.

Sie können auch feststellen, dass make kann auch ohne seine ganze Zahl verwendet werden Argument:

Karte: eine anfängliche Zuteilung nach der Größe gemacht wird, aber die resultierende Karte hat die Länge 0. die Größe weggelassen werden kann, in welchem ​​Fall eine kleine Ausgangsgröße zugeordnet ist.

Kanal: Der Puffer des Kanals wird mit der angegebenen Pufferkapazität initialisiert. Wenn Null, oder die Größe weggelassen wird, ist der Kanal ungepuffert.

Verwandte Themen