"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go Slice 사본에 추가하면 원본이 변경되는 이유는 무엇입니까?

Go Slice 사본에 추가하면 원본이 변경되는 이유는 무엇입니까?

2024년 11월 20일에 게시됨
검색:550

Why Does Appending to a Go Slice Copy Change the Original?

Go의 슬라이스 동작 이해: 추가하면 원본 슬라이스가 변경되는 이유는 무엇입니까?

제공된 코드 조각에는 someFunc 함수가 있습니다. 정수 조각에서 작동합니다. 함수 내에서 임시 슬라이스 tempA가 생성되고 입력 슬라이스 A의 값이 할당됩니다. 그러나 tempA에 추가되면 원본 A도 수정됩니다. 이 동작은 직관에 반하는 것처럼 보일 수 있으므로 왜 발생하는지 살펴보겠습니다.

Go에서 슬라이스는 []T 데이터 유형으로 선언됩니다. 여기서 T는 요소 유형을 나타냅니다. 이름에도 불구하고 슬라이스는 메모리에 연속적으로 저장된 요소의 모음이 아닙니다. 대신 다음 정보를 포함하는 헤더 구조입니다.

  • 길이: 슬라이스의 요소 수
  • 용량: 기본 배열이 보유할 수 있는 요소 수
  • 포인터: 슬라이스 데이터가 저장된 기본 배열에 대한 참조

슬라이스 변수의 값을 할당하면 전체 배열. 대신 동일한 기본 배열을 가리키는 새 슬라이스 헤더를 생성합니다. 따라서 tempA에 추가하는 등의 작업을 수행하면 기본 배열도 수정되고 결과적으로 원래 슬라이스 A의 값도 수정됩니다.

이 동작은 효율적인 메모리 관리를 보장하고 불필요한 작업을 방지하는 데 필수적입니다. 사자. 포인터 기반 접근 방식을 사용하면 Go 슬라이스는 별도의 길이 및 용량 값을 유지하면서 동일한 기본 배열을 공유할 수 있습니다. 이를 통해 비용이 많이 드는 복사 작업 없이도 슬라이스를 가볍게 수정할 수 있습니다.

슬라이스 동작과 기본 데이터 구조에 대한 더 깊은 이해를 보려면 다음 리소스를 참조하세요: https://blog.golang.org/ 슬라이스

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3