슬라이스를 섞는 것이 동일한 기본 어레이를 참조하는 다른 슬라이스에 영향을 미치는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-10-26 22:44:02
원래의
269명이 탐색했습니다.

Why Does Shuffling a Slice Affect Another Slice Referencing the Same Underlying Array?

Go에서 배열 처리 이해

http://golang.org/doc/ Effective_go.html#arrays의 문서에서는 Go에서 배열의 값 기반 특성을 강조합니다. Go, 배열을 다른 배열에 할당하면 모든 요소의 복사본이 생성됩니다. 이 원칙은 함수 인수에도 적용됩니다. 여기서 함수는 포인터가 아닌 배열의 복사본을 받습니다.

이 정보를 바탕으로 다음 코드를 사용하면 arr2 및 arr에 대한 고유한 배열이 생성될 것으로 예상할 수 있습니다. main() 함수:

<code class="go">package main

import (
    "fmt"
    "rand"
    "time"
)

func shuffle(arr []int) {
    rand.Seed(time.Nanoseconds())
    for i := len(arr) - 1; i > 0; i-- {
        j := rand.Intn(i)
        arr[i], arr[j] = arr[j], arr[i]
    }
}

func main() {
    arr := []int{1, 2, 3, 4, 5}
    arr2 := arr
    shuffle(arr)
    for _, i := range arr2 {
        fmt.Printf("%d ", i)
    }
}</code>
로그인 후 복사

그러나 코드는 예기치 않게 arr2도 섞습니다. 이 동작은 제공된 코드가 배열이 아닌 슬라이스에서 작동한다는 사실에서 비롯됩니다.

슬라이스: 배열에 대한 참조

Go는 값 시퀀스를 처리하는 보다 유연하고 효율적인 방법으로 슬라이스를 활용합니다. . 슬라이스는 기본 배열에 대한 참조이며, 한 슬라이스를 다른 슬라이스에 할당하면 단순히 참조가 복제됩니다.

예제 코드에서 arr := []int{1, 2, 3, 4, 5} 줄은 익명의 기본 정수 배열을 참조하는 슬라이스입니다. arr2 := arr이 실행되면 동일한 기본 배열도 참조하는 새 슬라이스가 생성됩니다.

배열 처리에 대한 의미

arr과 arr2 모두 동일한 기본 배열을 참조하므로 arr을 수정합니다. shuffle() 함수의 arr2에도 영향을 미칩니다. 이 동작은 기본 배열의 새 복사본을 생성하는 것이 아니라 단순히 참조를 복제하여 한 슬라이스를 다른 슬라이스에 할당하는 원칙에 부합합니다.

따라서 코드는 arr과 arr2가 모두 동일한 기본을 참조하므로 둘 다 올바르게 섞습니다. 정수 배열.

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

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