이동 중에지도 [키]를 삭제 하시겠습니까?


166

나는지도가있다 :

var sessions =  map[string] chan int{}

어떻게 삭제 sessions[key]합니까? 나는 시도했다 :

sessions[key] = nil,false;

작동하지 않았습니다.


업데이트 (2011 년 11 월) :

Go 버전 1 에서는 맵 항목을 삭제하기위한 특수 구문이 제거되었습니다 .

Go 1은 특수 맵 할당을 제거하고 새로운 내장 함수를 도입합니다 delete. : delete(m, x)식으로 검색된 맵 항목을 삭제합니다 m[x]. ...

답변:


154

이상하게도

package main

func main () {
    var sessions = map[string] chan int{};
    delete(sessions, "moo");
}

작동하는 것 같습니다. 그래도 자원을 제대로 사용하지 않는 것 같습니다!

다른 방법은 존재를 확인하고 값 자체를 사용하는 것입니다.

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}

값을보고하고 저렴해야 재사용 : sessions["moo"] = sessions["moo"], false;(? 그 잘못이있다거나)
u0b34a0f6ae

키가 없으면 충돌이 발생합니다. 귀하의 아이디어를 기반으로 다른 솔루션을 추가했습니다.

1
지도 자체를 정렬하는 동안 사용하기에 안전한가요?
Jorge Ramirez

@JorgeRamirez 나는 그렇게 믿지 않는다. 그렇게하려면 맵 객체 대신 키 슬라이스를 반복하는 방법을 찾으십시오
Seaux

6
두 번째 솔루션이 리소스를 더 잘 사용하는 이유는 무엇입니까? 두 번째 솔루션에서는 두 가지 주요 조회를 수행하는 반면 첫 번째 솔루션에서는 한 가지 주요 조회를 수행합니다.
thebiggestlebowski 2014 년

86

Go 1 릴리스 정보 에서 복사

옛 언어로, 키를 사용하여 항목을 삭제 k로 표시지도에서 m, 하나는, 문을 썼다

m[k] = value, false

이 구문은 유일무이 한 2 대 1 과제 인 특별한 경우입니다. 평가되었지만 폐기 된 값 (보통 무시되는 값)과 거의 항상 상수 인 부울 값을 전달해야했습니다. 그것은 일을했지만 이상하고 논쟁의 포인트였습니다.

Go 1에서는 그 구문이 사라졌습니다. 대신 새로운 내장 함수 인 delete. 호출

delete(m, k)

식으로 검색된 맵 항목을 삭제합니다 m[k]. 반환 값이 없습니다. 존재하지 않는 항목을 삭제하면 아무런 문제가 없습니다.

업데이트 : 실행 go fix형태의 표현으로 변환됩니다 m[k] = value, false으로 delete(m, k)는 무시 값이 안전하게 프로그램에서 폐기 될 수 있다는 것을 분명 할 때 false미리 정의 된 부울 상수를 의미한다. 수정 도구는 프로그래머가 검사 할 다른 구문 사용을 표시합니다.


55

에서 효과적인 이동 :

맵 항목을 삭제하려면 인수가 맵 및 삭제 될 키인 내장 함수 삭제 기능을 사용하십시오. 키가 이미지도에없는 경우에도이 작업을 수행하는 것이 안전합니다.

delete(timeZone, "PDT")  // Now on Standard Time

sessions.go:6: cannot use 0 (type int) as type chan int

3
@ Kinopiko : Jurily가 OP가 해당 코드 스 니펫을 사용한다고 생각하지는 않습니다. 그는 방금 문서에서 예제를 복사했습니다.
이사야

2
이후 삭제 된 것 같습니다. assignment count mismatch: 1 = 2 (use delete)
ghayes


0

make (chan int)대신에 사용하십시오 nil. 첫 번째 값은지도와 동일한 유형이어야합니다.

package main

import "fmt"

func main() {

    var sessions = map[string] chan int{}
    sessions["somekey"] = make(chan int)

    fmt.Printf ("%d\n", len(sessions)) // 1

    // Remove somekey's value from sessions
    delete(sessions, "somekey")

    fmt.Printf ("%d\n", len(sessions)) // 0
}

업데이트 : 내 대답을 수정했습니다.


sessions.go:6: cannot use 0 (type int) as type chan int

P : 죄송합니다, 나는 너무 제거 것을 잊었다
이사야

package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}

위의 버전은 Go 버전에서 컴파일되고 실행됩니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.