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