2017-02-24 139 views
1

我追加了未知數量的項目(角落找尋10.000)初始化內容成片僅獲得從中分得一杯羹

le := 500 
l := make([]string, le) 
l = append(l, "a") 
l = append(l, "b") 
l = append(l, "c") 
l = append(l, "d") 
l = append(l, "...") 

for i, v := range l{ 
    fmt.Printf("i:%d-v:%s\n", i, v) 
} 

在這之後我的幻燈片包含

i:0-v: 
... 
i:500-v:a 
i:501-v:b 
i:502-v:c 
i:503-v:d 
i:504-v:e 

我正在尋找一個方式來獲取只存儲在片中的初始化項目。 我想被擺脫i:0-v:i:499-v:

我能獲得所需的結果重新切片l,以除去片的第一元件(第一元件取決於對傳遞給make方法length參數的數目) 。

l = l[le:] 
for j, k := range l{ 
    fmt.Printf("i:%d-v:%s\n", j, k) 
} 

我的問題是:它是實現這一目標的正確方法,還是有擺脫未初始化的項目的更好的方式,追加過程中添加?

+0

AFAIK,一切都在Go中初始化。你想要那些非空的'l'元素。 –

+0

是的你是對的,我想要的元素被初始化爲「零值」...... – Nirekin

+0

初始化長度爲1的片段在這個例子中絕對沒有好處。如果你不知道最終容量,那麼讓'append'爲你做。如果你這樣做,初始化容量,而不是長度。 – JimB

回答

3

爲什麼不把一個空的切片,

// create a slice with len 0 
l := []string{} 

l = append(l, "a") 
l = append(l, "b") 
l = append(l, "c") 
l = append(l, "d") 
l = append(l, "...") 

會給出一個輸出,

i:0-v:a 
i:1-v:b 
i:2-v:c 
i:3-v:d 
i:4-v:... 

Example

+0

是的,但我有一個巨大的項目列表(大約10.000)。創建長度爲0的片會對性能產生影響嗎? – Nirekin

+0

@Nirekin不一定。當使用追加功能時,尺寸以2^n的速率增加。所以從0開始並從大小1開始的差異將是一個額外的副本。 – nu11p01n73R

+0

當我遇到這個問題時,我使用了1號尺寸作爲我的示例,我使用的是500號尺寸。 – Nirekin

3

您可以創建使用0長度和容量提供了一個切片,內建make()函數採用可選的第三個參數作爲容量:

l := make([]string, 0, 1000) // Use a capacity that is enough for you 

如果當前容量不足以執行附加操作,則可以通過這種方式在不需要append()的情況下追加元素,以重新分配(並隱式複製)內容。

還需要注意的是更有效地使用設定的標定元件不是追加(通過使用append()你必須返回的片首部分配回,即使大部分時間它不會改變):

c, l := 0, make([]string, 1000) // Use a length that is enough for you 

l[c], c = "a", c+1 
l[c], c = "b", c+1 
l[c], c = "c", c+1 
l[c], c = "d", c+1 
l[c], c = "e", c+1 

// We're done: slice the slice: 
l = l[:c] 

for i, v := range l { 
    fmt.Printf("i:%d-v:%s\n", i, v) 
} 

輸出(嘗試在Go Playground):

i:0-v:a 
i:1-v:b 
i:2-v:c 
i:3-v:d 
i:4-v:e 

還要注意,在實踐中,當你與你從什麼地方得到的值填入您的切片,不需要手動平衡處理,循環利用了照顧。例如:

c := 0 
for ; c < 5; c++ { 
    l[c] = string('a' + c) // Acquire next element to store in the slice 
} 

// We're done: slice the slice: 
l = l[:c] 

試試這個Go Playground

請注意,您只能使用此功能,但如果您創建的切片肯定不會很小,否則l[c]會在c達到該長度時給您帶來運行時恐慌。