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