구조체 값 업데이트
구조체를 처리할 때 값 업데이트가 어려울 수 있습니다. 다음 코드를 고려하십시오.
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 구조체를 수정하려면 다음 단계를 따르세요.
수정된 코드는 다음과 같습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!