2016-07-13 7 views
9

goに書いているマージソート実装で、配列に必要な長さを計算しようとしています。それは次のようになります。go testを実行しているときにGoエラー:不定配列バウンド

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

私は、この苦情を取得:

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

私はgoを想定して計算した値で配列の長さをインスタンス化するユーザーを楽しむことはありません。それは定数を受け入れるだけです。私はあきらめて代わりにスライスを使うべきですか? スライスは、リンクされたリストか、いっぱいになると大きな配列にコピーされるという意味の動的配列です。

+0

スライスがダイナミックアレイであることを「期待している」とはどういう意味ですか? [スライスが実際に何であるかを読む](https://blog.golang.org/go-slices-usage-and-internals)。 –

+1

これは、Goでどのようなスライスが作成されるかです。フードの下では、配列へのポインタに過ぎません。 – user937284

+0

@TimCooper面白いです。 Arrayの複雑なインターフェイスを与える代わりに、スライスは配列の操作を簡単にする別のレイヤーですか? – Breedly

答えて

20

実行時に計算された値を持つ配列をインスタンス化することはできません。代わりにmakeを使用して、目的の長さのスライスを初期化します。それはこのようになります。

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

*スライスを使用することができます。*スライス*はあなたの例で使用されています。それは返されるものです。 –

+0

@TimCooper良い点。 – evanmcdonnal