최근에 Golang으로 코드를 작성할 때 "범위 변수에 할당할 수 없습니다..."라는 오류가 발생했습니다. 이 오류를 해결하는 방법을 모르기 때문에 매우 괴로웠습니다. 몇 가지 탐구와 연구 끝에 마침내 해결책을 찾았고 이제 이를 여러분과 공유합니다.
먼저 이 오류가 발생하는 시나리오를 살펴보겠습니다. Golang에서는 일반적으로 컨테이너의 요소(예: 배열, 슬라이스 등)를 반복하기 위해 range 키워드를 사용합니다. 반복 프로세스 중에 요소를 수정하려고 하면 "범위 변수에 할당할 수 없습니다..."라는 오류가 발생합니다. 나타날거야. . 예는 다음과 같습니다.
package main import "fmt" func main() { nums := []int{1, 2, 3, 4, 5} for _, num := range nums { num = num * 2 // 报错:“cannot assign to range variable num” } fmt.Println(nums) }
이 예에서는 nums의 각 요소에 2를 곱하려고 합니다. 그러나 컴파일 프로세스 중에 "범위 변수 num에 할당할 수 없습니다"라는 오류가 발생했습니다. 이것이 Woolen Cloth?
이유는 Golang의 range 키워드 반복이 요소 자체가 아닌 요소의 복사본을 가져오기 때문입니다. 루프 본문 내에서 복사본을 변경해도 원본 요소는 변경되지 않습니다. 따라서 num 값을 수정하는 것은 유효하지 않으며 오류가 발생합니다.
이 문제를 해결하는 방법은 무엇입니까? 이 문제를 해결하는 방법에는 두 가지가 있습니다.
방법 1: 인덱스 반복 사용
for 루프의 인덱스를 사용하여 컨테이너의 요소를 반복한 다음 복사본 값을 수정하는 대신 원본 요소의 값을 수정할 수 있습니다. 다음은 코드 구현입니다.
package main import "fmt" func main() { nums := []int{1, 2, 3, 4, 5} for i := range nums { nums[i] = nums[i] * 2 } fmt.Println(nums) }
코드에서는 i를 인덱스로 사용하여 컨테이너 nums의 요소를 반복하고 nums[i]의 값을 수정합니다. 이런 방식으로 원래 요소의 값을 성공적으로 수정할 수 있으며 출력 결과는 [2 4 6 8 10]입니다.
방법 2: 포인터 사용
요소에 대한 포인터를 사용하여 이 문제를 해결할 수도 있습니다. 원본 요소의 값은 반복된 복사본에 대한 포인터를 함수에 대한 매개 변수로 전달하여 수정할 수 있습니다. 다음은 코드 구현입니다.
package main import "fmt" func double(num *int) { *num = *num * 2 } func main() { nums := []int{1, 2, 3, 4, 5} for i, num := range nums { double(&nums[i]) } fmt.Println(nums) }
코드에서 매개변수가 int 유형에 대한 포인터인 이중 함수를 정의합니다. for 루프에서는 컨테이너 nums의 요소를 반복하고 반복된 복사본의 포인터를 double 함수에 전달합니다. 이 함수는 원래 요소의 값을 수정하고 반환합니다. 이런 방식으로 원래 요소의 값을 성공적으로 수정할 수 있으며 출력 결과는 [2 4 6 8 10]입니다.
요약하자면 Golang의 "범위 변수에 할당할 수 없습니다..." 오류를 해결하기 위해 인덱스 반복과 포인터를 사용하는 두 가지 방법을 사용할 수 있습니다. 특정 비즈니스 요구에 따라 적절한 해결 방법을 선택하여 해결해야 합니다.
위 내용은 golang 오류: '범위 변수에 할당할 수 없습니다...' 어떻게 해결하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!