Go에서지도를 지우는 방법?


85

.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 ++ 의 함수와 는 여전히 다릅니다 .


1
또한이 토론을 참조하십시오 : groups.google.com/d/topic/golang-nuts/6yHDC7IYCj4/discussion
perreal

1
정화에 대한 논의도 있습니다 내장
perreal

답변:


108

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

그래서 예, 당신은 아마도

mymap = make(map[keytype]valtype)

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

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

1
그렇다면 요소를 하나씩 삭제하는 것이 유일한 방법입니까?
lavin

@lavin : 네. 이를 수행하는 내장 함수가 없으며 임의의 맵에 대해이를 수행하는 라이브러리 함수를 가질 수 없습니다. 하지만 어쨌든 3 줄 밖에 안 돼요.
Lily Ballard 2012

6
모든 값을 반복하면서 맵의 내용을 수정해도 괜찮습니까? 이 경우 다른 언어는 제대로 작동하지 않습니다.
John Jeffery

5
@JohnJeffery : 게시하기 전에 이것을 테스트했습니다. 작동하는 것 같습니다. 사양의 실제 언어는 The iteration order over maps is not specified and is not guaranteed to be the same from one iteration to the next. If map entries that have not yet been reached are deleted during iteration, the corresponding iteration values will not be produced. If map entries are inserted during iteration, the behavior is implementation-dependent, but the iteration values for each entry will be produced at most once. If the map is nil, the number of iterations is 0.이것이 지원된다는 것을 나타냅니다.
Lily Ballard

18
Go 1.11부터는이 형식의 맵 지우기 작업이 컴파일러에 의해 최적화됩니다. github.com/golang/go/blob/master/doc/go1.11.html
벤자민 B.

20

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가 다른 것을 참조 할 때까지).


2
// 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{}

-5

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

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

3
그것은 맵을 지우는 것이 아니라 새 맵을 만들고 각 루프마다 동일한 이름을 가진 지역 변수에 바인딩합니다.
Delaney
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.