【问题标题】:Runtime error: "assignment to entry in nil map"运行时错误:“分配给 nil 映射中的条目”
【发布时间】:2013-02-13 13:55:24
【问题描述】:

我正在尝试创建一片地图。虽然代码编译得很好,但我得到下面的运行时错误:

mapassign1: runtime·panicstring("assignment to entry in nil map");

我尝试创建一个 Map 数组,每个 Map 包含两个指标,一个“Id”和一个“Investor”。我的代码如下所示:

for _, row := range rows {
        var inv_ids []string
        var inv_names []string

        //create arrays of data from MySQLs GROUP_CONCAT function
        inv_ids = strings.Split(row.Str(10), ",")
        inv_names = strings.Split(row.Str(11), ",")
        length := len(inv_ids);

        invs := make([]map[string]string, length)

        //build map of ids => names
        for i := 0; i < length; i++ {
            invs[i] = make(map[string]string)
            invs[i]["Id"] = inv_ids[i]
            invs[i]["Investor"] = inv_names[i]
        }//for

        //build Message and return
        msg := InfoMessage{row.Int(0), row.Int(1), row.Str(2), row.Int(3), row.Str(4), row.Float(5), row.Float(6), row.Str(7), row.Str(8), row.Int(9), invs}
        return(msg)
    } //for

我最初认为像下面这样的东西会起作用,但这也不能解决问题。有什么想法吗?

invs := make([]make(map[string]string), length)

【问题讨论】:

  • 你的代码适合我:play.golang.org/p/DaY5qdBGpy
  • 如果你的地图定义得很好,但你可能想使用结构体。 struct{Id, 投资者字符串}

标签: go


【解决方案1】:

您正在尝试创建 slice 的地图;考虑以下示例:

http://play.golang.org/p/gChfTgtmN-

package main

import "fmt"

func main() {
    a := make([]map[string]int, 100)
    for i := 0; i < 100; i++ {
        a[i] = map[string]int{"id": i, "investor": i}
    }
    fmt.Println(a)
}

你可以重写这些行:

invs[i] = make(map[string]string)
invs[i]["Id"] = inv_ids[i]
invs[i]["Investor"] = inv_names[i]

作为:

invs[i] = map[string]string{"Id": inv_ids[i], "Investor": inv_names[i]}

这被称为复合文字

现在,在一个更惯用的程序中,您很可能希望使用 struct 来代表投资者:

http://play.golang.org/p/vppK6y-c8g

package main

import (
    "fmt"
    "strconv"
)

type Investor struct {
    Id   int
    Name string
}

func main() {
    a := make([]Investor, 100)
    for i := 0; i < 100; i++ {
        a[i] = Investor{Id: i, Name: "John" + strconv.Itoa(i)}
        fmt.Printf("%#v\n", a[i])
    }
}

【讨论】:

  • 在我写这个问题之前,我什至告诉自己,确保你称它为切片而不是数组哈哈。我已经编辑了这个问题,一切似乎都使用复合文字。谢谢!
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多