2015-09-18 3 views
0

Я новичок в golang, и я пытаюсь создать карту типа map [string] interface {}.golang map of interface - panic: присвоение записи в nil map

Но когда я пытаюсь создать новый ключ, когда он не существует, я получаю ошибку времени выполнения «panic: assign to entry in nil map». Может ли кто-нибудь сказать мне, что я делаю неправильно, пожалуйста?

Go PlayGround: https://play.golang.org/p/vIEE0T11yl

Вот мой код:

package main 

func main() { 
    buffer := Buffer{} 
    buffer.AddRecord("myKey", 12345) 
} 

type Buffer struct { 
    records map[string][]interface{} 
} 

// ProcessRecord adds a message to the buffer. 
func (buffer *Buffer) AddRecord(key string, record interface{}) { 
    _, ok := buffer.records[key] 
    if !ok { 
     buffer.records[key] = make([]interface{}, 0) 
    } 

    buffer.records[key] = append(buffer.records[key], record) 
} 
+0

Я не знал, не было ли у меня инициализации, когда я задал этот вопрос, поэтому я не знаю, является ли это технически дублированием. В противном случае я знал, как инициализировать карту внутри структуры или в этом случае карту среза интерфейса. – bn00d

ответ

8

Вы должны инициализировать саму карту: https://play.golang.org/p/wl4mMGjmRP

func (buffer *Buffer) AddRecord(key string, record interface{}) { 
    // Check for nil, else initialise the map 
    if buffer.records == nil { 
     buffer.records = make(map[string][]interface{}) 
    } 
    _, ok := buffer.records[key] 
    if !ok { 
     buffer.records[key] = make([]interface{}, 0) 
    } 

    buffer.records[key] = append(buffer.records[key], record) 
} 

Вы также можете использовать конструктор для вашего типа структуры - например NewBuffer(...) *Buffer - это также инициализирует поле, но это хорошая практика, чтобы проверить нуль перед использованием. То же самое касается доступа к клавишам карты.

+0

Я знал, что делаю что-то действительно глупое. Большое спасибо, вы спасли меня много времени – bn00d

Смежные вопросы