2013-02-27 13 views
11

Tôi đang cố tạo một bản đồ. Mặc dù mã biên dịch tốt, tôi nhận được lỗi runtime dưới đây:Lỗi thời gian chạy: "gán cho mục nhập trong bản đồ nil"

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

tôi cố gắng để làm cho một mảng của Maps, với mỗi đồ chứa hai indicies, một "Id" và "Chủ đầu tư". Mã của tôi trông giống như sau:

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 

Tôi bước đầu nghĩ rằng điều gì đó dưới đây sẽ hoạt động, tuy nhiên điều đó cũng không khắc phục được sự cố. Bất kỳ ý tưởng?

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

Mã của bạn hoạt động tốt đối với tôi: http: // chơi .golang.org/p/DaY5qdBGpy –

+3

Nếu bản đồ của bạn được định nghĩa rất tốt mặc dù bạn có thể muốn sử dụng cấu trúc thay thế. struct {Id, chuỗi nhà đầu tư} –

Trả lời

10

Bạn đang cố gắng tạo một lát bản đồ; xem xét ví dụ sau:

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

Bạn có thể viết lại những dòng này:

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

như:

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

này được gọi là một composit đen.

Bây giờ, trong một chương trình nhiều thành ngữ, bạn sẽ có lẽ hầu hết muốn sử dụng một struct để đại diện cho một nhà đầu tư:

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

Trước khi tôi viết câu hỏi, tôi thậm chí còn tự nhủ, hãy chắc chắn bạn gọi nó là một lát không phải là mảng haha. Tôi đã chỉnh sửa câu hỏi và mọi thứ dường như hoạt động bằng cách sử dụng nội dung tổng hợp. Cảm ơn! – user387049

Các vấn đề liên quan