在Golang中创建多维嵌套地图切片 太长,读不下去了这就像将子类别的值存储为数组中父id的索引一样。请参阅块末尾的等效PHP代码。

在Golang中创建多维嵌套地图切片 太长,读不下去了这就像将子类别的值存储为数组中父id的索引一样。请参阅块末尾的等效PHP代码。,go,Go,我需要存储dad-childrennumber的值。有多个父亲,每个父亲都有多个女儿。有些父亲可能也没有女儿。因此,我需要将价值存储为:- variableName[DadID][indexFrom0ToAvailableValue] = {"id": id, "name": name} 其中,indexFrom0toAvailableValue是子项及其id和名称的索引 我在做什么:- patu := make(map[int][]map[string]string) p,n := 0,0

我需要存储
dad-children
number的值。有多个父亲,每个父亲都有多个女儿。有些父亲可能也没有女儿。因此,我需要将价值存储为:-

variableName[DadID][indexFrom0ToAvailableValue] = {"id": id, "name": name}
其中,
indexFrom0toAvailableValue
是子项及其
id
名称的索引

我在做什么:-

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个父ID和49行

所以,你可以看到,有很多空白地图[]。它们会被创造出来。我需要清理一下。在存储子详细信息之前,先创建4个空白映射。因此,女儿的详细信息将存储在第五张地图中。我假设如果会有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);
            }
        }
    }

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})

你应该试着想出一个简单易懂且自包含的例子。@volker,我在代码末尾也添加了等效的PHP代码,这对我的例子很有效。@volker,这就像在数组中将子类别的值存储为父id的索引。哇!这有多简单,
append
我怎么能忽略这一点。谢谢@dev.bmax