>백엔드 개발 >Golang >Go의 맵과 슬라이스가 함수 매개변수로 전달될 때 왜 다르게 동작합니까?

Go의 맵과 슬라이스가 함수 매개변수로 전달될 때 왜 다르게 동작합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-14 14:02:12557검색

Why Do Go's Maps and Slices Behave Differently When Passed as Function Parameters?

슬라이스 및 맵이 매개변수와 다르게 동작하는 이유

Go에서 슬라이스 및 맵 참조 유형은 함수 매개변수로 전달될 때 대조되는 동작을 나타냅니다. 데이터 구조에 대한 포인터인 맵은 함수 내의 해당 요소에 대한 수정 사항을 반영합니다. 그러나 배열 포인터, 길이 및 용량을 저장하는 구조체인 슬라이스에 추가된 새 요소는 인수에 반영되지 않습니다.

이 차이점은 기본 구현에서 비롯됩니다.

  • 맵: 맵은 데이터 구조에 대한 포인터입니다. 즉, 맵이 함수에 전달될 때 실제 맵에 대한 포인터를 제공합니다. 포인터는 변경되지 않고 그대로 유지되므로 지도 요소에 대한 모든 수정 사항은 원래 지도에 반영됩니다.
  • 슬라이스: 반면에 슬라이스는 배열 포인터, 길이 및 용량. 슬라이스가 함수에 전달되면 컴파일러는 슬라이스 헤더(즉, 구조체)의 복사본을 만듭니다. 슬라이스가 변경되면 이러한 변경 사항은 복사본에만 영향을 미칩니다. 함수는 원본 슬라이스에 대해 알지 못하며 슬라이스에 추가된 모든 새 요소는 원본에 반영되지 않습니다.

이 동작은 Go의 값별 전달 의미에 더욱 영향을 받습니다. 값이 함수에 전달됩니다. 포인터인 맵은 여전히 ​​값으로 전달되지만 복사본은 여전히 ​​동일한 기본 데이터 구조를 가리킵니다. 이를 통해 수정 사항이 원본에 반영될 수 있습니다. 그러나 슬라이스가 전달되면 슬라이스 헤더의 복사본이 만들어지며 해당 복사본에 대한 변경 사항은 원본으로 다시 전파되지 않습니다.

슬라이스에 대해 유사한 동작을 달성하려면 포인터를 전달해야 합니다. 슬라이스로 변환하여 효과적으로 숨겨진 포인터로 만듭니다. 그러나 이 방법은 거의 사용되지 않으며 대신 원하는 수정 사항이 포함된 새 슬라이스를 반환하는 것이 더 일반적인 접근 방식입니다.

위 내용은 Go의 맵과 슬라이스가 함수 매개변수로 전달될 때 왜 다르게 동작합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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