"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 슬라이스를 섞는 것이 Go에서 할당된 슬라이스에 영향을 미치는 이유는 무엇입니까?

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

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

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

Go에서 배열 처리

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)
    }
}

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

설명

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

배열 대 슬라이스

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

슬라이스 조작

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

함수 동작

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

결론

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

최신 튜토리얼 더>

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

Copyright© 2022 湘ICP备2022001581号-3