2017-08-27 82 views
-1

我正在嘗試使用遞歸結構體,當我有多個結構體時,我可以將它們加在一起,創建一個嵌入這些結構體的新結構體。但是,我不確定正確的方法是什麼。如何將多個結構體加入到同一個結構體中

我已經在下面的代碼片段中進一步說明我的意思。

package main 

import "fmt" 

type Container struct { 
    F   int 
    Collection []SubContainer 
} 

type SubContainer struct { 
    Key string 
    Value int 
} 

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

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

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

     if len(sc) == 2 { 
      c = append(c, Container{Collection: sc, F: count}) 
      sc = nil 
     } 
    } 

    for _, r := range c { 
     fmt.Println(r) 
    } 
} 

結果:

{2 [{a 1} {b 2}]} 
{4 [{c 3} {d 4}]} 

期望的結果:

{6 {2 [{a 1} {b 2}]} {4 [{c 3} {d 4}]}} 

遊樂場鏈接:我有麻煩纏繞我的頭周圍https://play.golang.org/p/j6rbhgcOoT

一個需要注意的是,commits長度可能會改變(我最初認爲我可以創建一個差異t父結構)。任何建議,將不勝感激...這樣做與遞歸結構正確的方法來完成這個?謝謝!

+1

什麼樣的角色是'F'在這裏玩?如果它只是切片的長度,爲什麼不用一種方法計算呢?目前還不清楚你想要的結果是什麼。爲什麼'if len(sc)== 2'特例? 6,2和4在這裏代表什麼(它們與1,2,3和4有什麼關係)?你提到你想要遞歸,但是你的類型沒有遞歸。 (有關Go中遞歸數據結構的示例,請參閱https://stackoverflow.com/questions/37366219/golang-recursive-data-structures#37366490)。 –

回答

0

我試圖接近所需的輸出而不確定具體目標,您會在下面找到您提供的代碼段的修改版本。

您可以使用集合上的String() string方法來自定義格式。

package main 

import "fmt" 

type ContainerCollection struct { 
    Count int 
    List []Container 
} 

func (cc ContainerCollection) String() string { 
    total := 0 
    for _, c := range cc.List { 
     total += c.F 
    } 
    return fmt.Sprintf("{%d %v}", total, cc.List) 
} 

type Container struct { 
    F   int 
    Collection []SubContainer 
} 

type SubContainer struct { 
    Key string 
    Value int 
} 

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

    c := ContainerCollection{Count: 0} 
    sc := []SubContainer{} 

    for k, v := range commits { 
     sc = append(sc, SubContainer{Key: k, Value: v}) 
     c.Count++ 
     if len(sc) == 2 { 
      c.List = append(c.List, Container{Collection: sc, F: c.Count}) 
      sc = []SubContainer{} 
     } 
    } 
    // Should also cover odd number of commits 
    if len(sc) != 0 { 
     c.Count++ 
     c.List = append(c.List, Container{Collection: sc, F: c.Count}) 
    } 

    // for _, r := range c.List { fmt.Println(r) } 

    fmt.Println(c) 
} 

結果:

{6 [{2 [{a 1} {b 2}]} {4 [{c 3} {d 4}]}]} 

Playground

0

這裏的東西以最小的修改代碼(只是增加了一個 '超級' 的容器,這基本上是一個總結結構)。一個可能只需要這個,如果這是通過網絡傳遞給另一個庫/包/等,否則只是維護totalCount可能就足夠了。

package main 

import "fmt" 

type SuperContainer struct { 
    TotalCount int 
    Containers []Container 
} 

type Container struct { 
    F   int 
    Collection []SubContainer 
} 

type SubContainer struct { 
    Key string 
    Value int 
} 

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

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

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

     if len(sc) == 2 { 
      totalCount += count 
      c = append(c, Container{Collection: sc, F: count}) 
      sc = nil 
     } 
    } 

    for _, r := range c { 
     fmt.Println(r) 
    } 
    supC := SuperContainer{TotalCount: totalCount, Containers: c} 
    fmt.Println(supC) 
} 

遊樂場:https://play.golang.org/p/yN3N3gHaCX