[go] Go에서지도를 지우는 방법?

.clear() 기본 유형에 대한 C ++ 함수와 같은 것을 찾고 map있습니다.

아니면 그냥 새 맵을 만들어야합니까?

업데이트 : 귀하의 답변에 감사드립니다. 답변을 살펴보면서 나는 때때로 새지도를 만들면 우리가 원하지 않는 불일치가 발생할 수 있음을 깨달았습니다. 다음 예를 고려하십시오.

var a map[string]string
var b map[string]string

func main() {
    a = make(map[string]string)
    b=a
    a["hello"]="world"
    a = nil
    fmt.Println(b["hello"])
}

내 말은, 이것은 .clear()객체의 내용을 지우는 C ++ 의 함수와 는 여전히 다릅니다 .



답변

아마도 새지도를 만들어야 할 것입니다. 동일한 맵이 여러 코드 조각에 의해 참조되고 한 조각이이 변경 사항이 다른 코드 조각에 표시되도록 명시 적으로 값을 지워야하는 경우가 아니라면 기존 맵을 지우려고 노력할 실제 이유가 없습니다.

그래서 예, 당신은 아마도

mymap = make(map[keytype]valtype)

어떤 이유로 든 기존지도를 정말로 지워야하는 경우 다음과 같이 간단합니다.

for k := range m {
    delete(m, k)
}


답변

C ++와 달리 Go는 가비지 수집 언어입니다. 조금 다르게 생각해야합니다.

새지도를 만들 때

a := map[string]string{"hello": "world"}
a = make(map[string]string)

원래 맵은 결국 가비지 수집됩니다. 수동으로 지울 필요가 없습니다. 그러나 맵 (및 슬라이스)은 참조 유형이라는 것을 기억하십시오. 당신은 그들을 만들 make(). 기본 맵은 참조가없는 경우에만 가비지 수집됩니다. 따라서 할 때

a := map[string]string{"hello": "world"}
b := a
a = make(map[string]string)

원래 배열은 가비지 수집되지 않습니다 (b가 가비지 수집되거나 b가 다른 것을 참조 할 때까지).


답변

// Method - I , say book is name of map
for k := range book {
    delete(book, k)
}

// Method - II
book = make(map[string]int)

// Method - III
book = map[string]int{}


답변

루프에서이 작업을 수행하려는 경우 초기화를 활용하여 맵을 지울 수 있습니다. 예를 들면 :

for i:=0; i<2; i++ {
    animalNames := make(map[string]string)
    switch i {
        case 0:
            animalNames["cat"] = "Patches"
        case 1:
            animalNames["dog"] = "Spot";
    }

    fmt.Println("For map instance", i)
    for key, value := range animalNames {
        fmt.Println(key, value)
    }
    fmt.Println("-----------\n")
}

이것을 실행하면 이전 맵을 지우고 빈 맵으로 시작합니다. 이는 출력으로 확인됩니다.

$ go run maptests.go
For map instance 0
cat Patches
-----------

For map instance 1
dog Spot
-----------


답변