运行时错误:“在无位图中进行赋值”
问题描述:
我正在尝试创建一片地图。虽然代码编译好,我得到以下运行时错误:运行时错误:“在无位图中进行赋值”
mapassign1: runtime·panicstring("assignment to entry in nil map");
我试图做地图的数组,其中包含两个indicies,一个“身份证”和“投资者”每个地图。我的代码如下所示:
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)
答
您正在尝试创建地图的片;请看下面的例子:
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])
}
}
+1
在我写这个问题之前,我甚至告诉过自己,确保你把它称为一个片而不是数组哈哈。我编辑了这个问题,并且一切似乎都在使用复合文字。谢谢! – user387049 2013-02-27 17:37:48
您的代码工作正常,我:HTTP://播放.golang.org/p/DaY5qdBGpy – 2013-02-27 17:22:38
如果您的地图定义得非常好,但您可能希望使用结构。 struct {Id,Investor string} – 2013-02-27 17:24:47