2014-04-25 54 views
12

如何在Go中以運行時大小分配數組?如何在Go中分配非常量大小的數組

下面的代碼是非法的:

n := 1 
var a [n]int 

你得到的消息prog.go:12: invalid array bound n(或類似),而這工作得很好:

const n = 1 
var a [n]int 

麻煩的是,我可能不知道的大小我想要的數組直到運行時。

(順便說一句,我第一次看在回答這個問題How to implement resizable arrays in Go,但是這是一個不同的問題。)

回答

17

答案是你不分配一個陣列直接,你會得到去創建時分配一個分片

內置功能make([]T, length, capacity)創建一個切片和它後面陣列,並且沒有(傻)上的lengthcapacity值編譯時間常數-限制。因爲它說的Go language specification

make創建切片總是分配給它返回的切片值指的是一個新的,隱藏的陣列。

因此,我們可以這樣寫:

n := 12 
s := make([]int, n, 2*n) 

,並有一個數組分配的大小2*n,用s初始化是它的第一個半片。

我不知道幹嗎去了不分配給,你可以間接地做到這一點的陣列[n]int直接,但得到的答覆很明確:「在圍棋中,使用片而不是陣列(大部分時間)

+1

即使反射包似乎也不允許分配動態大小的數組。我懷疑這與類型系統有關,因爲數組大小是類型的一部分,所以動態大小需要動態生成新的類型ID。 – Evan

+1

@Evan是的,儘管我避免使用*動態*來描述這一點。嚴格地說,數組大小不是動態的:一旦創建數組大小是固定的。我想這與你無法得到切片後面的數組有關。如果可以的話,你可以看看它的類型,這將不得不重新生成。它具有某種意義。 –

+0

我接受了我自己的答案,因爲它看起來是正確的。 –

相關問題