Çalışma zamanı hatası: sıfır haritasındaki girişe atama


101

Bir harita oluşturmaya ve ardından bunu aşağıdaki gibi bir yaml dosyasına dönüştürmeye çalışıyorum:

uid :
      kasi:
        cn: Chaithra
        street: fkmp
      nandan:
        cn: Chaithra
        street: fkmp
      remya:
        cn: Chaithra
        street: fkmp

Haritayı oluştururken önemli bir şeyi kaçırdığımı düşünüyorum. Kodum aşağıda.

package main

import (
    "fmt"
    "gopkg.in/yaml.v2"
)

type T struct {
    cn     string
    street string
}

func main() {
    names := []string{"kasi", "remya", "nandan"}

    m := make(map[string]map[string]T, len(names))
    for _, name := range names {

        //t := T{cn: "Chaithra", street: "fkmp"}

        m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}

    }
    fmt.Println(m)

    y, _ := yaml.Marshal(&m)

    fmt.Println(string(y))
    //fmt.Println(m, names)
}

Şu hatayı veriyor:

panic: runtime error: assignment to entry in nil map

Yanıtlar:


136

İç haritanızı başlatmadınız. For döngünüzden önce m["uid"] = make(map[string]T)ad ekleyebilir ve sonra atayabilirsiniz.


20

Haritanın sıfır olup olmadığını kontrol etmeli ve for döngüsü içinde sıfırsa birini başlatmalısınız:

if m["uid"] == nil {
    m["uid"] = map[string]T{}
}

5

Hataya göre bir şey var

assignment to entry in nil map

İç içe geçmiş haritalar için derin seviye anahtarına atandığında, dış anahtarının bir değeri olduğundan emin olmamız gerekir. Aksi takdirde haritanın sıfır olduğunu söyleyecektir. Örneğin sizin durumunuzda

m := make(map[string]map[string]T, len(names))

m, değer olarak stringanahtar içeren iç içe geçmiş bir haritadır map[string]T. Ve değeri sen atıyorsun

m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}

Burada gördüğünüz m["uid"]olduğunu nilve bunun bir değeri içeren belirten vardır [name]Çeşidi yuvalanmış değerine bir anahtardır T. Bu yüzden önce "uid" ye değer atamanız veya onu şu şekilde başlatmanız gerekir:

m["uid"] = make(map[string]T)

1

@Makpoc soruyu zaten yanıtladı. sadece fazladan bilgi eklemek.

Harita türleri, işaretçiler veya dilimler gibi başvuru türleridir ve bu nedenle yukarıdaki m'nin değeri sıfırdır; başlatılmış bir haritayı göstermez. Sıfır haritası, okurken boş bir harita gibi davranır, ancak sıfır haritaya yazma girişimleri çalışma zamanı paniğine neden olur; bunu yapma. Harita hakkında daha fazla bilgi

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.