Sebastian의 답변은 정확하지만 왜 안전한지 알고 싶었 으므로 Map 소스 코드를 파헤 쳤습니다 . 에 대한 호출 에서처럼 보이지만 delete(k, v)
기본적으로 실제로 값을 삭제하는 대신 플래그를 설정하고 카운트 값을 변경합니다.
b->tophash[i] = Empty;
(빈 값은 상수입니다 0
)
지도는 실제로 당신의 속도로 삽입을 수행으로 성장하는지도의 크기에 따라 버킷 세트 번호 할당되어 일을 할 나타납니다 무엇 2^B
(에서 이 소스 코드 ) :
byte *buckets; // array of 2^B Buckets. may be nil if count==0.
따라서 사용하는 것보다 거의 항상 할당 된 버킷이 많으며 range
맵을 오버 오버 할 때 tophash
각 버킷의 값을 확인하여 2^B
건너 뛸 수 있는지 확인합니다.
요약 하면 데이터는 기술적으로 여전히 존재하기 때문에 delete
내부 range
는 안전하지만 데이터를 확인하면 데이터를 tophash
건너 뛰고 range
수행중인 작업에 포함시킬 수 없음을 알 수 있습니다 . 소스 코드에는 TODO
다음이 포함됩니다 .
// TODO: consolidate buckets if they are mostly empty
// can only consolidate if there are no live iterators at this size.
이것은 delete(k,v)
함수를 사용하여 실제로 메모리를 비우는 것이 아니라 액세스 권한이있는 버킷 목록에서 메모리를 제거하는 이유를 설명합니다 . 실제 메모리를 확보하려면 가비지 콜렉션이 시작되도록 전체 맵에 도달 할 수 없도록해야합니다. 다음과 같은 행을 사용하여이를 수행 할 수 있습니다.
map = nil