>  기사  >  백엔드 개발  >  Golang의 슬라이스는 값으로 함수에 전달되더라도 원래 배열을 어떻게 수정합니까?

Golang의 슬라이스는 값으로 함수에 전달되더라도 원래 배열을 어떻게 수정합니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-30 12:34:15505검색

How do slices in Golang modify the original array even though they are passed to functions by value?

배열을 함수에 전달하고 Golang에서 수정

C와 같은 프로그래밍 언어에서 배열은 함수에 전달될 때 암시적으로 참조로 전달됩니다. 그러나 Golang에서는 이 동작이 다르기 때문에 다른 언어에서 오는 사람들에게는 혼란스러울 수 있습니다.

차이: 배열과 슬라이스

제공된 코드에서 예:

<code class="go">func main() {
    tab := []int{1, 2, 3}
    fmt.Println(tab)
    reverse(tab)
    fmt.Println(tab)
}

func reverse(tab []int) {
    for i, j := 0, len(tab)-1; i < j; i, j = i+1, j-1 {
        tab[i], tab[j] = tab[j], tab[i]
    }
}</code>

배열이 값(참조가 아님)으로 전달되는 것으로 보이지만 역방향 함수는 여전히 원래 배열을 수정합니다. 여기서 핵심은 Golang에서 "tab"이 배열이 아니라 슬라이스라는 점입니다.

Go의 슬라이스

슬라이스는 경량 데이터입니다. 배열의 연속적인 부분을 나타내는 구조체. 이는 기본 배열에 대한 포인터, 길이 및 용량으로 구성됩니다. 슬라이스가 함수에 전달되면 전체 기본 배열이 아닌 헤더 정보(포인터, 길이, 용량)만 복사됩니다.

참조로 슬라이스 전달

따라서 함수 내의 슬라이스에 대한 모든 변경 사항은 동일한 데이터를 가리키므로 기본 배열에 영향을 미칩니다. 위의 예에서 reverse 함수는 슬라이스의 요소를 수정하고 이는 원래 배열 탭에 영향을 미칩니다.

결론

Go의 배열은 다음을 통해 전달됩니다. 값(복사), 조각은 참조로 전달됩니다(기본 데이터 공유). 예상치 못한 동작을 피하기 위해 Golang의 함수에 배열이나 슬라이스를 전달할 때 이러한 차이점을 이해하는 것이 중요합니다.

위 내용은 Golang의 슬라이스는 값으로 함수에 전달되더라도 원래 배열을 어떻게 수정합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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