2013-02-27 23 views
11

Bir dilim Haritalar oluşturmaya çalışıyorum. Kod iyi derler rağmen, çalışma zamanı hatası aşağıda olsun:Çalışma zamanı hatası: "nil haritada giriş atama"

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

İki indicies, bir "İd" ve "Yatırımcı" içeren her Map ile, Maps bir dizi yapmaya çalışırlar. Benim kod şöyle görünür:

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 

Başlangıçta her iki sorunu düzeltmek olmadığını ancak, aşağıda gibi bir şey işe düşündüm. Herhangi bir fikir?

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

Kodunuz benim için çalışıyor: http: // oyun .golang.org/p/DaY5qdBGpy –

+3

Eğer haritalar çok iyi tanımlanmış olsaydı, bunun yerine muhtemelen bir struct kullanmak istersiniz. struct {Id, Yatırımcı dizgisi} –

cevap

10

Sen haritaların bir dilim oluşturmaya çalışıyoruz; Aşağıdaki örneği ele alalım:

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

Sen bu satırları yazabilirsiniz:

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

olarak: Bu bir kompozit literal denir

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

.

Şimdi, daha deyimsel programda, büyük olasılıkla bir yatırımcı temsil edecek bir struct kullanmak isterdim:

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

Kendime bile söylediğim soruyu yazmadan önce, bir dizi haha ​​değil, bir dilim olarak adlandırdığınızdan emin olun. Soruyu düzenledim ve her şey kompozit edebi kullanımıyla çalışıyor gibi görünüyor. Teşekkürler! – user387049

İlgili konular