>백엔드 개발 >Golang >Go 슬라이스와 맵: Append가 다르게 동작하는 이유는 무엇입니까?

Go 슬라이스와 맵: Append가 다르게 동작하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-19 17:13:10342검색

Go Slices vs. Maps: Why Do Appends Behave Differently?

슬라이스 대 맵: 매개변수 참조 동작 이해

Go에서 슬라이스와 맵은 모두 참조 유형을 나타냅니다. 두 유형 중 하나의 요소를 수정하면 해당 요소에서 파생된 모든 슬라이스/맵에 변경 사항이 반영됩니다. 이러한 공유 수정 동작은 포인터를 통해 수행된 수정 사항이 원본 맵에 적용되는 포인터 기반 맵 구현의 결과입니다.

그러나 새 요소를 추가하면 슬라이스와 맵이 다르게 동작합니다. 제공된 코드 예제에서 지도(editMap)에 새 요소를 추가하면 원래 지도를 통해 해당 요소에 액세스할 수 있게 됩니다. 그러나 슬라이스(editSlice)에 추가해도 원본 슬라이스에는 아무런 영향이 없습니다.

이러한 불일치는 슬라이스와 맵 간의 기본 구현 차이에서 비롯됩니다. 맵은 해시 맵 구조에 대한 포인터로 구현되는 반면, 슬라이스는 배열을 참조하는 경량 구조체입니다. 맵에 새 요소를 추가할 때 포인터는 일정하게 유지되므로 파생된 모든 맵에서 새 요소가 표시됩니다.

반대로, 슬라이스에 추가할 때 슬라이스 헤더(슬라이스 길이 설명, 용량 및 배열 포인터)를 수정해야 합니다. 그러나 Go는 변수를 값으로 전달하므로 (전달된 매개변수에서) 슬라이스 헤더 복사본에 대한 모든 변경 사항은 원본 슬라이스에 반영되지 않습니다.

슬라이스와 맵 간의 일관된 동작을 달성하려면, 맵과 유사하게 슬라이스를 포인터로 구현할 수 있습니다. 이렇게 하면 슬라이스에 대한 포인터를 통해 수정된 내용이 원본 슬라이스도 수정되는 것을 보장할 수 있습니다. 그러나 이 접근 방식은 슬라이스 포인터 전달 및 작업에 대한 언어 지원이 부족하기 때문에 Go에서는 일반적이지 않습니다. 대신 수정 후 새 조각을 반환하는 규칙이 널리 채택됩니다.

위 내용은 Go 슬라이스와 맵: Append가 다르게 동작하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.