> 백엔드 개발 > Golang > Go의 Range 키워드를 사용하면 배열 요소를 수정하는 데 실패하는 이유는 무엇이며 배열 인덱스는 어떻게 솔루션을 제공할 수 있습니까?

Go의 Range 키워드를 사용하면 배열 요소를 수정하는 데 실패하는 이유는 무엇이며 배열 인덱스는 어떻게 솔루션을 제공할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-12-17 11:23:25
원래의
218명이 탐색했습니다.

Why Does Using Go's Range Keyword Fail to Modify Array Elements, and How Can Array Indices Provide a Solution?

범위 값 대신 요소 수정을 위해 배열 인덱스 사용

Go 프로그래밍에서 range 키워드는 컬렉션을 반복하고 두 키를 모두 반환합니다. 그리고 각 요소 값의 사본입니다. 이 동작은 루프 내에서 값 수정을 방해할 수 있습니다. 다음 예에서는 이 문제를 보여줍니다.

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Attempt to modify field using range values:
    for _, e := range array {
        e.field = "foo"
    }

    // Verify that field hasn't been modified:
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
로그인 후 복사

이 코드에서는 범위 루프를 사용하여 배열에 있는 각 요소의 필드를 수정하려고 합니다. 그러나 범위는 값의 복사본을 반환하므로 배열의 실제 요소는 변경되지 않습니다. 이로 인해 모든 필드 값이 비어 있게 됩니다.

해결책: 배열 인덱스 사용

이 문제를 해결하고 실제 요소를 수정하려면 대신 배열 인덱스를 사용해야 합니다. 범위 루프에서 반환된 값입니다. 수정된 코드는 다음과 같습니다.

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    // Modify field using array indices:
    for idx, _ := range array {
        array[idx].field = "foo"
    }

    // Verify that field has been modified:
    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}
로그인 후 복사

값 대신 각 요소의 인덱스를 사용하면 배열의 실제 요소에 직접 액세스하고 수정할 수 있습니다. 이렇게 하면 필드 값이 올바르게 업데이트됩니다.

위 내용은 Go의 Range 키워드를 사용하면 배열 요소를 수정하는 데 실패하는 이유는 무엇이며 배열 인덱스는 어떻게 솔루션을 제공할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿