>백엔드 개발 >Golang >Go 루프에서 내 구조체 업데이트가 지속되지 않는 이유는 무엇입니까?

Go 루프에서 내 구조체 업데이트가 지속되지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-15 11:33:02589검색

Why Aren't My Struct Updates Persistent in a Go Loop?

구조체의 값 업데이트가 작동하지 않음

루프 반복 중에 구조체 내의 요소를 조작함에도 불구하고 루프 종료 시 업데이트가 유지되지 않습니다. 올바른 구조체 조작을 위해서는 이 동작의 이유를 이해하는 것이 중요합니다.

문제

구조체 슬라이스를 반복할 때 루프 변수는 요소 자체가 아닌 원본 요소의 복사본을 참조합니다. . 따라서 루프 내 수정 사항은 사본에만 영향을 미치고 슬라이스의 실제 요소에는 영향을 미치지 않습니다.

해결책

구조 요소를 성공적으로 업데이트하려면 다음 접근 방식을 사용할 수 있습니다.

  • 슬라이스 대신 인덱스를 반복합니다: 인덱스를 반복하면 실제 구조체 요소에 직접 액세스할 수 있습니다. 이를 통해 루프 후에도 지속되는 수정이 가능합니다.
  • 포인터 방지: 값을 업데이트할 때 슬라이스나 요소에 대한 포인터가 필요하지 않습니다. 슬라이스에 직접 액세스할 수 있으며 포인터 없이 요소를 업데이트할 수 있습니다.

다음은 솔루션을 따르는 업데이트된 코드 조각입니다.

type FTR struct {
    Id       string
    Mod      []Mod
}

type Mod struct {
    Name       string
    Type       string
}

for index := range ftr.Mod {
    switch ftr.Mod[index].Type {
    case "aaa", "bbbb":
        ftr.Mod[index].Type = "cccc"
    case "htr":
        ftr.Mod[index].Type = "com"
    case "no":
        ftr.Mod[index].Type = "jnodejs"
    case "jdb":
        ftr.Mod[index].Type = "tomcat"
    }
}

이를 채택하여 접근 방식을 사용하면 구조체 요소가 성공적으로 업데이트되고 루프가 종료된 후에도 변경 사항이 유지됩니다.

위 내용은 Go 루프에서 내 구조체 업데이트가 지속되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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