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

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

Susan Sarandon
Susan Sarandon원래의
2024-10-26 22:44:02373검색

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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