>  기사  >  백엔드 개발  >  Go에서 함수 내부의 배열을 수정하면 함수 외부의 동일한 배열에 할당된 변수도 변경되는 이유는 무엇입니까?

Go에서 함수 내부의 배열을 수정하면 함수 외부의 동일한 배열에 할당된 변수도 변경되는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-26 01:25:28706검색

Why does modifying an array inside a function in Go also change a variable assigned to the same array outside the function?

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

이 코드에서 shuffle 함수는 배열을 입력으로 사용하고 해당 요소를 섞습니다. 그러나 shuffle을 호출하기 전에 원래 배열을 새 변수 arr2에 할당하더라도 함수 내의 arr에 대한 변경 사항은 arr2에 반영됩니다.

슬라이스 대 배열

Go는 슬라이스와 배열을 구별합니다. 배열은 고정 길이 값 목록인 반면, 슬라이스는 기본 배열에 대한 참조입니다. 코드 예제에서 arr과 arr2는 모두 동일한 기본 배열을 참조합니다. 결과적으로 arr에 대한 모든 수정 사항은 arr2에도 적용됩니다. 배열의 고유한 복사본을 생성하려면 make를 사용하여 슬라이스를 할당해야 합니다.

arr := []int{1, 2, 3, 4, 5}
arr2 := make([]int, len(arr))
copy(arr2, arr)

이 업데이트된 버전에서 arr2는 더 이상 원본 배열에 대한 참조가 아니므로 arr에 대한 수정 사항은 영향을 미치지 않습니다. arr2.

위 내용은 Go에서 함수 내부의 배열을 수정하면 함수 외부의 동일한 배열에 할당된 변수도 변경되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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