2016-07-13 46 views
9

Sto provando a calcolare la lunghezza necessaria per un array in un'implementazione di tipo merge che sto scrivendo in go. Ecco come si presenta:Errore Go: array non costante associato

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

Allora ottengo questa denuncia quando si esegue go test:

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

Presumo go non gode utenti istanziazione lunghezza di un array con un valore calcolato. Accetta solo le costanti . Dovrei semplicemente rinunciare e usare una fetta invece? Mi aspetto una fetta è una matrice dinamica che significa che è una lista collegata o copia in una matrice più grande quando si riempie.

+0

Cosa vuoi dire che "ti aspetti" una sezione è una matrice dinamica? [Leggi cosa è effettivamente una fetta] (https://blog.golang.org/go-slices-usage-and-internals). –

+1

Ecco a cosa servono le Slice in Go. Sotto il cofano sono solo indicatori di array. – user937284

+0

@TimCooper interessante. Invece di dare a Array un'interfaccia complessa, le slice sono un altro strato che semplifica la manipolazione degli array? – Breedly

risposta

20

Non è possibile creare un'istanza di un array come quello con un valore calcolato in fase di esecuzione. Utilizzare invece make per inizializzare una sezione con la lunghezza desiderata. Sembrerebbe questo;

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

* Questo o potresti usare le fette. * Slices * are * usato nel tuo esempio; è ciò che viene restituito. –

+0

@TimCooper buon punto. – evanmcdonnal