배열을 함수에 전달하고 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!