런타임 오류 : nil 맵의 항목에 할당


101

지도를 생성 한 다음 다음과 같이 yaml 파일로 변환하려고합니다.

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

지도를 만드는 동안 중요한 것이 누락 된 것 같습니다. 내 코드는 다음과 같습니다.

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

다음과 같은 오류가 발생합니다.

panic: runtime error: assignment to entry in nil map

답변:


136

내부지도를 초기화하지 않았습니다. for 루프 전에 m["uid"] = make(map[string]T)이름을 추가 한 다음 할당 할 수 있습니다 .


20

맵이 nil인지 확인하고 for 루프 내에서 nil이면 초기화해야합니다.

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

5

오류에 따른 것이 있습니다

assignment to entry in nil map

중첩 된 맵의 경우 딥 레벨 키에 할당 할 때 외부 키에 값이 있는지 확인해야합니다. 그렇지 않으면지도가 nil이라고 말할 것입니다. 예를 들어 귀하의 경우

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

m은 값으로 string키 를 포함하는 중첩 된 맵입니다 map[string]T. 그리고 당신은 가치를 할당합니다

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

여기에서 m["uid"]is 를 볼 수 있으며 중첩 된 값 유형의 키인 nil[name]이 포함되어 있음을 나타 T냅니다. 따라서 먼저 "uid"에 값을 할당하거나 다음과 같이 초기화해야합니다.

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

1

@Makpoc은 이미 질문에 대답했습니다. 추가 정보를 추가하는 것뿐입니다.

지도 유형은 포인터 또는 슬라이스와 같은 참조 유형이므로 위의 m 값은 nil입니다. 초기화 된지도를 가리 키지 않습니다. nil 맵은 읽을 때 빈 맵처럼 동작하지만 nil 맵에 쓰려고하면 런타임 패닉이 발생합니다. 그러지 마. 지도에 대한 자세한 정보

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.