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

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

Susan Sarandon
Susan Sarandon원래의
2024-12-27 18:27:15116검색

Why Does Modifying Values Using Go's `range` Keyword Fail, 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

    for _, e := range array {
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

범위 반복은 문자열 "foo"를 다음에 할당할 것으로 예상됩니다. 배열의 각 요소에 대한 필드입니다. 그러나 두 번째 루프가 업데이트된 값을 인쇄하면 모든 필드가 비어 있습니다. 이는 범위의 복사 기반 의미 때문입니다.

반복 중에 배열 내의 값을 효과적으로 수정하려면 범위 변수 대신 배열 인덱스를 사용해야 합니다.

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

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

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

이 수정을 통해 인덱스 변수가 배열의 실제 요소를 참조하여 두 번째 루프에서 올바른 필드 업데이트와 올바른 출력이 가능해집니다.

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

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