> 백엔드 개발 > Golang > Go 슬라이스에 추가하지 않는 것이 동일한 기본 어레이를 가리키는 다른 슬라이스에 영향을 주지 않는 이유는 무엇입니까?

Go 슬라이스에 추가하지 않는 것이 동일한 기본 어레이를 가리키는 다른 슬라이스에 영향을 주지 않는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2024-11-15 00:43:02
원래의
702명이 탐색했습니다.

Why Doesn't Appending to a Go Slice Affect Other Slices Pointing to the Same Underlying Array?

슬라이스에서 Append의 동작 이해

문제 설명:

다음 Go 코드를 고려하세요.

func main() {
    slice := make([]int, 10, 10)
    slice[0] = 0
    slice[1] = 1

    slice1 := slice
    slice1[0] = 10000
    fmt.Println(slice)

    slice1 = append(slice1, 100)
    slice1[0] = 20000

    fmt.Println(slice)
}
로그인 후 복사

초기 출력은 예상대로입니다. 슬라이스와 슬라이스1 모두 동일한 값을 표시합니다. 그러나 슬라이스1에 대한 추가 작업 후에는 슬라이스 값이 변경되지 않은 상태로 유지됩니다. 슬라이스가 포인터라는 가정을 고려할 때 이 동작은 직관적이지 않은 것처럼 보입니다.

설명:

append 함수는 Slice1을 수정하지 않습니다. Go는 모든 값을 값별로 전달하므로, Slice1은 슬라이스의 복사본을 받습니다. 원래 배열이 용량에 도달했으므로 추가 작업을 통해 새 배열이 생성됩니다. 그런 다음 이전 배열의 내용을 새 배열에 복사하고 새 배열을 가리키는 새 슬라이스 헤더를 반환합니다.

slice1에 반환 값을 할당하면 Slice1이 변경됩니다. 그러나 슬라이스는 원래 배열을 가리키는 별도의 변수이기 때문에 영향을 받지 않습니다. 따라서 추가 작업 후 슬라이스1 또는 슬라이스의 요소에 대한 변경 사항은 다른 요소에 반영되지 않습니다.

요약하면 Go의 슬라이스는 값별로 전달되며 추가는 새로운 슬라이스를 생성합니다. 필요한 경우 기본 배열. 이는 한 슬라이스에 대한 변경 사항이 원래 배열을 가리키는 다른 슬라이스에 반영되지 않음을 의미합니다.

위 내용은 Go 슬라이스에 추가하지 않는 것이 동일한 기본 어레이를 가리키는 다른 슬라이스에 영향을 주지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿