>  기사  >  백엔드 개발  >  루프 내에서 Go 구조체의 값을 업데이트해도 원래 구조체가 수정되지 않는 이유는 무엇입니까?

루프 내에서 Go 구조체의 값을 업데이트해도 원래 구조체가 수정되지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-16 15:07:03262검색

Why Does Updating Values in a Go Struct Inside a Loop Not Modify the Original Struct?

구조체 값 업데이트

구조체를 처리할 때 값 업데이트가 어려울 수 있습니다. 다음 코드를 고려하십시오.

ftr := FTR{}

err = yaml.Unmarshal([]byte(yamlFile), &ftr)

for index, element := range ftr.Mod {

    switch element.Type {
    case “aaa”, “bbbb”:
        element.Type = "cccc”
    case "htr”:
        element.Type = "com"
    case "no":
        element.Type = "jnodejs"
    case "jdb”:
        element.Type = "tomcat"
    }

}

이 루프를 실행한 후 루프 내의 명백한 업데이트에도 불구하고 원래 ftr 구조체는 수정되지 않습니다. 무엇이 문제일까요?

문제: 포인터 및 구조체 풀기

Go에서는 구조체를 값으로 함수에 전달하면 구조체의 복사본이 생성됩니다. 원래 구조체에 대한 포인터를 제공하는 참조로 전달합니다. 이 경우 range를 사용하여 ftr.Mod를 반복하면 Mod 요소의 복사본이 생성됩니다. 즉, 루프 내에서 변경된 내용이 원래 ftr 구조체에 반영되지 않습니다.

해결책: 인덱스 및 포인터 사용

원본 ftr 구조체를 수정하려면 다음 단계를 따르세요.

  1. 인덱스를 사용하여 반복: 대신 ftr.Mod의 인덱스를 반복합니다. 요소 자체.
  2. 포인터 사용: 구조체 정의의 Mod 유형을 []*Mod로 변경합니다.
  3. 포인터에 액세스: 내부 루프에서 포인터를 사용하여 Mod 요소의 값에 액세스합니다: *ftr.Mod[index].

수정된 코드는 다음과 같습니다.

type FTR struct {
    Id       string     
    Mod      []*Mod  // Use pointers for Mod
}

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"
    }

}

포인터를 사용하여 직접 다음을 수행할 수 있습니다. 원래 ftr 구조체의 값을 수정하세요.

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

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