【问题标题】:Creating Multi dimensional Nested Map slice in Golang在 Golang 中创建多维嵌套地图切片
【发布时间】:2017-07-26 15:43:38
【问题描述】:

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 Total Number of Rows。

所以,你可以看到,有很多空白 map[] 。哪个被创建。我需要清理这个。在存储女儿详细信息之前,每个前 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);
            }
        }
    }

【问题讨论】:

  • 您应该尝试提出可理解且独立的示例。
  • @volker ,我也添加了等效的 PHP 代码,它在代码末尾适用于我的示例。
  • @volker ,就像将子类别的值存储为数组中父ID的索引一样。

标签: go


【解决方案1】:

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

【讨论】:

  • 哇!那是多么容易,@ 987654324@ 我怎么能忽略这个。谢谢@dev.bmax
猜你喜欢
  • 2016-05-23
  • 2014-03-25
  • 2018-01-09
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 2017-11-02
  • 2016-02-22
  • 2019-11-25
相关资源
最近更新 更多