2013-08-31 58 views
2

如果我創建具有(例如)獲取在Go(語言)從片陣列

mySlice := make([]int, 5, 10) 

切片然後我想[10]int類型的陣列默默地創建的,並且收到一個切片時「看到」前5個整數。

(右?轉到文檔不太句話這樣說,但是由於片必須始終有一個基本數組的地方,我看不出它如何能是任何其他方式。)

所以我相信以上是速記:

var myArray [10]int 
mySlice := myArray[0:5] 

但是,當我使用第一種方法,我沒有數組的句柄。有沒有辦法從切片中獲得它?

回答

3

沒有使用不安全的指針技巧,沒有辦法如何從切片中獲取數組。

+0

OK,所以[10] int數組* *是當我使用make([] int,5,10)創建時,我無法實現它。正確?因此,如果我確實需要某個地方的底層數組的句柄,那麼顯式創建數組然後切片的「長形式」方法將是唯一的方法? –

+0

「長形」允許保持底層數組的實例可達。必須小心不要使用'append'和slice-derived-from-array,因爲slice和它的「原始」支持數組之間的「連接」會中斷。我不知道你想要做什麼,但是如果你試圖解決這個問題,可能會出現這種情況。我不記得以前使用或討論過的類似方法。 – zzzz

+0

我只是想完全理解Go的數組和切片,來自C/C++/D背景。你提到可能會破壞切片和原始切片之間的連接。這聽起來像D一樣的行爲,我希望Go沒有這個問題。我猜如果超過原始片的容量(這是原始數組的* length *),'append'將靜靜地創建一個新的底層數組? –

2

我不確定你想要什麼樣的「句柄」,但數組在Go中按值傳遞。因此,如果您有一個將數組作爲參數的函數,您可以將切片中的數據複製到數組中,並傳遞數組。無論如何,當您將該數組傳遞給該函數時,該數組將被複制。

如果它是你自己的代碼,想要與數組一起工作,它可以完成與數組一樣的切片。

你不能沒有不安全的唯一要做的就是創建一個指向數組,但你可以做不安全,很容易:

arrayPtr := (*[10]int)(unsafe.Pointer(&mySlice[0]))