> 백엔드 개발 > Golang > Go Range 루프에서 구조체 값을 수정해도 원본 슬라이스가 변경되지 않는 이유는 무엇입니까?

Go Range 루프에서 구조체 값을 수정해도 원본 슬라이스가 변경되지 않는 이유는 무엇입니까?

Barbara Streisand
풀어 주다: 2024-12-20 19:05:11
원래의
276명이 탐색했습니다.

Why Doesn't Modifying Struct Values in a Go Range Loop Change the Original Slice?

유형 구조 범위의 값을 수정할 수 없는 이유

Go에서는 슬라이스와 같은 유형 구조 범위가 복사본이 아닌 기본 데이터 보기. 범위를 반복할 때 반복 변수에 대한 수정 사항은 원본 데이터가 아닌 해당 특정 보기에만 영향을 미칩니다.

이를 이해하려면 다음 코드 조각을 고려하세요.

type myStruct struct {
    Name  string
    Count int
}

func main() {
    chartRecords := []myStruct{}
    for i := 0; i < 4; i++ {
        n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)}
        chartRecords = append(chartRecords, n)
    }

    for _, elem := range chartRecords {
        elem.Count = 0
        fmt.Println(elem)
    }

    fmt.Println(chartRecords)
}
로그인 후 복사

이것은 코드 조각은 ChartRecords 범위를 반복하고 각 반복 변수의 Count 필드를 0으로 수정한 다음 수정된 변수를 인쇄합니다. 그러나 원본 ChartRecords 슬라이스가 인쇄되면 Count 필드 값이 변경되지 않은 것으로 표시됩니다.

이는 range 절이 있는 for 루프가 범위에 있는 각 요소의 복사본을 생성하기 때문입니다. 복사본에 대한 수정 사항은 원본 요소에 영향을 주지 않습니다. 원본 요소를 수정하려면 조각의 해당 인덱스에 액세스하여 명시적으로 업데이트해야 합니다. 예:

func main() {
    chartRecords := []myStruct{}
    for i := 0; i < 4; i++ {
        n := myStruct{Count: i, Name: fmt.Sprintf("Joe%2d", i)}
        chartRecords = append(chartRecords, n)
    }

    for i, elem := range chartRecords {
        chartRecords[i] = myStruct{Count: 0, Name: elem.Name}
    }

    fmt.Println(chartRecords)
}
로그인 후 복사

이 예에서는 범위 절이 있는 for 루프를 사용하여 차트 레코드 범위를 반복합니다. 각 반복마다 인덱스를 사용하여 조각의 원래 요소에 액세스하고 요소 값이 업데이트됩니다. 이 접근 방식을 사용하면 수정 사항이 원본 ChartRecords 슬라이스에 반영됩니다.

위 내용은 Go Range 루프에서 구조체 값을 수정해도 원본 슬라이스가 변경되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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