2017-08-25 40 views
1

我試圖一次向結構數組添加2個項目,然後連續每2個項目創建一個新的結構數組並追加到最終的Container結構。我正在努力尋找這樣做的正確方法。一次添加兩個項目以構建for循環

爲了進一步說明我的意思:

package main 

import "fmt" 

type Container struct { 
    Collection []SubContainer 
} 

type SubContainer struct { 
    Key string 
    Value int 
} 

func main() { 
    commits := map[string]int{ 
     "a": 1, 
     "b": 2, 
     "c": 3, 
     "d": 4, 
     "e": 5, 
     "f": 6, 
    } 

    sc := []SubContainer{} 
    c := Container{} 

    for k, v := range commits { 
     sc = append(sc, SubContainer{Key: k, Value: v}) 
    } 

    for _, s := range sc { 
     c.Collection = append(c.Collection, s) 
    } 

    fmt.Println(c) 
} 

鏈接:https://play.golang.org/p/OhSntFT7Hp

我期望的行爲是遍歷所有的commits,每一次的SubContainer達到LEN(2),追加到Container,並創建一個新的SubContainer,直到for循環完成。如果元素數量不統一,那麼最後一個SubContainer將只保存一個元素並像正常一樣附加到Container。

有沒有人有任何建議如何做到這一點?道歉,如果這是一個明顯的答案,非常新的去!

+0

什麼'sc'的目的是什麼?您可以直接追加到'c.Collection'並完全跳過'sc'。同樣的結果。 – icza

回答

1

您可以通過將切片設置爲零來「重置」切片。此外,您可能不知道,無切片工作的很好追加:

var sc []SubContainer 
c := Container{} 

for k, v := range commits { 
    sc = append(sc, SubContainer{Key: k, Value: v}) 
    if len(sc) == 2 { 
     c.Collection = append(c.Collection, sc...) 
     sc = nil 
    } 
} 
if len(sc) > 0 { 
    c.Collection = append(c.Collection, sc...) 

} 

https://play.golang.org/p/ecj52fkwpO

+0

很酷,沒意識到我可以重置爲'nil'。謝謝! –

+0

出於好奇,一次追加兩個。 Container的最終結果似乎仍然是單片值。有沒有一個技巧讓Container結構能夠容納多個SubContainer?例如,您可以遍歷c.Collection並查看分組 –

+0

我想知道爲什麼要一次追加兩個分組。如果你想要一個對的列表,你需要將Collection聲明爲一片切片。 https://play.golang.org/p/pckuuomKsj – Peter