>백엔드 개발 >Golang >슬라이스를 섞는 것이 Go에서 할당된 슬라이스에 영향을 미치는 이유는 무엇입니까?

슬라이스를 섞는 것이 Go에서 할당된 슬라이스에 영향을 미치는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-27 03:57:031105검색

Why does shuffling a slice affect a slice assigned to it in Go?

Go에서 배열 처리

Go에서 배열은 값 유형이며, 한 배열을 다른 배열에 할당하면 모든 요소의 복사본이 생성됩니다. 이는 메모리 참조가 아닌 복사본을 수신하므로 배열을 함수에 전달하는 경우에도 마찬가지입니다.

원래 질문

다음 코드:

<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와 arr이 별개의 개체일 것으로 예상했음에도 불구하고 arr2가 셔플 기능의 영향을 받는 이유에 대해 혼란을 표현했습니다.

설명

이 문제는 배열과 슬라이스 사이의 오해에서 비롯됩니다.

배열과 슬라이스

배열은 고정 길이의 값 모음인 반면, 슬라이스는 기본 배열에 대한 동적 참조입니다. 제공된 코드 예제에서는 배열이 사용되지 않습니다.

슬라이스 조작

arr := []int{1, 2, 3, 4, 5} 행 익명의 기본 배열을 참조하는 슬라이스를 생성합니다. 후속 arr2 := arr 행은 단순히 이 참조를 복제하여 arr과 arr2가 모두 동일한 기본 배열을 가리키도록 합니다.

함수 동작

arr을 arr에 전달할 때 shuffle 함수를 사용하면 기본 배열이 아닌 슬라이스의 복사본이 생성됩니다. 이 복사본은 함수에 의해 수정되므로 arr이 수정되면 arr2도 영향을 받습니다.

결론

Go에서 슬라이스는 기본 배열에 대한 참조로 작동합니다. 한 조각을 다른 조각에 할당하면 기본 배열이 아닌 참조가 복사됩니다. 이 개념은 Go의 슬라이스 조작을 이해하는 데 매우 중요합니다.

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

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