在Golang中创建多维嵌套地图切片

时间:2017-07-25 12:02:43

标签: go

TLDR;它就像将子类的值存储为数组中父id的索引一样。请参阅块结尾处的等效PHP代码。

我需要存储dad-daughter个数字的值。有多个人是父亲,每个父亲有多个女儿。有些父亲可能也没有女儿。所以,我需要将价值存储为: -

variableName[DadID][indexFrom0ToAvailableValue] = {"id": id, "name": name}

其中indexFrom0toAvailableValue是女儿及其idname的编号索引。

我在做什么: -

patu := make(map[int][]map[string]string)

p,n := 0,0

for _,c := range  dadhu {
    // c.Daughter of value 2 means, current c is father
    if( c.Daughter == 2 ) {

        // Below i am using len(daddhu) to know
        // number of rows available. This is creating another bug
        // as it is creating lots of blank map.

        patu[c.DadID] = make([]map[string]string, len(dadhu))

        // Created array `patu` with `DadID` which will store 
        // their children below for range loop in above array

        p++
    }
}
fmt.Println("Total Father is : ", p)

for _,c := range dadhu {
    // c.Daughter of value 1 means, current c is daughter

    if ( c.Daughter == 1 ) {
        cID = strconv.Itoa(c.ID)
        patu[c.DadID][n] = map[string]string{"id": cID, "name" : c.Name}
        n++
    }
}

这很好用,但我的问题是,它正在创建如下地图: -

map[44:[map[] map[] map[] map[] map[id: 45 name:Lana] map[] map[] map[] map[] map[id:46 name:Mana] map[] map[] map[] map[] map[id: 47 name:Bana].........] 28:[[map[] map[] map[] map[] map[id: 29 name:Lana] map[] map[] map[] map[] map[id:30 name:Mana] map[] map[] map[] map[] map[id: 31 name:Bana]........map[] map[] map[] map[]]] 

等等。

mysql中共有5个Parent ID和49个总行数。

所以,你可以看到,有很多空白地图[]。哪个被创造了。我需要清理它。在存储女儿细节之前,每个前4个空白地图。因此,女儿的细节将存储在第5张地图中。我假设如果有7个人是父亲,那么从4个空白地图可能会变成6个空白地图。

我在这里找不到任何逻辑错误,除了我正在使用len(dadhu)因为我需要提供一些价值,但我不确定,哪位父亲有多少女儿。

如果在golang中出现各种问题,请告诉我替代方法。

仅供参考:它在PHP中的等效代码 - 工作正常是:

$patu = array();
$wod = array();
foreach ($dadhu as $e) {
    if ($e->isChild == '2') {
        $woc[] = $e->id;
        $patu[$e->id] = array();
    }
}
foreach($dadhu as $c) {
    if($c->isChild == '1') {
            if(in_array($c->dadID, $wod)) {
                $patu[$c->dadID][] = array($c->id, $c->name);
            }
        }
    }

1 个答案:

答案 0 :(得分:4)

Go中的切片是动态调整大小的,你不应该像对待数组一样对待它们。

在第一个循环中,如果您不知道确切的大小,请不要使用len(dadhu)初始化切片。

相反,制作一个空切片:

patu[c.DadID] = make([]map[string]string, 0)

在第二个循环中,将地图附加到它:

patu[c.DadID] = append(patu[c.DadID], map[string]string{"id": cID, "name": c.Name})