2016-07-13 6 views
9

Ich versuche, die erforderliche Länge für ein Array in einer Merge-Sortierung-Implementierung zu berechnen Ich schreibe go. Es sieht wie folgt aus:Go-Fehler: nicht konstante Array-Grenze

func merge(array []int, start, middle, end int) { 
    leftLength := middle - start + 1 
    rightLength := end - middle 
    var left [leftLength]int 
    var right [rightLength]int 
    //... 
} 

ich dann diese Beschwerde erhalten, wenn go test läuft:

./mergesort.go:6: non-constant array bound leftLength 
./mergesort.go:7: non-constant array bound rightLength 

Ich gehe davon aus go Benutzer nicht genießen ein Array der Länge mit einem berechneten Wert instanziieren. Es akzeptiert nur Konstanten. Soll ich einfach aufgeben und stattdessen eine Scheibe benutzen? Ich erwarte eine Scheibe ist ein dynamisches Array, was bedeutet, es ist entweder eine verkettete Liste oder Kopien in ein größeres Array, wenn es voll wird.

+0

Was meinst du mit "erwarten" ein Stück ist ein dynamisches Array? [Lesen Sie, was ein Stück tatsächlich ist] (https://blog.golang.org/go-slices-usage-and-internals). –

+1

Das ist, was Slices in Go gemacht werden. Unter der Haube sind sie nur Zeiger auf Arrays. – user937284

+0

@TimCooper interessant. Anstatt Arrays selbst eine komplexe Schnittstelle zu geben, sind Slices eine weitere Schicht, die die Array-Manipulation vereinfacht. – Breedly

Antwort

20

Sie können ein solches Array nicht mit einem zur Laufzeit berechneten Wert instanziieren. Verwenden Sie stattdessen make, um eine Scheibe mit der gewünschten Länge zu initialisieren. Es würde so aussehen;

left := make([]int, leftLength) 
+2

* Das oder Sie könnten Slices verwenden. * Slices * werden * in Ihrem Beispiel verwendet; es ist was zurückgegeben wird. –

+0

@TimCooper guter Punkt. – evanmcdonnal

Verwandte Themen