구조체 유형에 대한 Setter 이해
Go에서는 setter 함수를 통해 구조체를 수정할 수 있습니다. 그러나 구조체 유형에 대해 setter를 사용할 때 특정 동작은 예상하지 못할 수 있습니다. 다음 예를 고려하십시오.
package main import "fmt" type T struct { Val string } // this setter seems not to work func (t T) SetVal(s string) { t.Val = s } // this setter, using ptr to T, seems to work ok func (t *T) SetVal2(s string) { (*t).Val = s } func main() { v := T{"abc"} fmt.Println(v) // prints {abc} v.SetVal("pdq") fmt.Println(v) // prints {abc}, was expecting {pdq}! v.SetVal2("xyz") fmt.Println(v) // prints {xyz}! }
SetVal 함수가 원래 구조체를 예상대로 수정하지 않는 이유는 무엇입니까?
값 의미 이해
라는 질문이 생깁니다.주요 차이점은 구조체가 함수에 전달되는 방식에 있습니다. SetVal에서와 같이 구조체를 값으로 전달하면 함수 내에서 구조체의 복사본이 생성됩니다. 함수 내에서 변경된 사항은 이 임시 복사본에만 영향을 미치며 원본 구조체는 변경되지 않습니다.
그러나 포인터로 구조체를 전달할 때(SetVal2에서와 같이) 함수는 메모리의 원본 구조체에 액세스할 수 있습니다. 함수 내에서 이루어진 모든 변경 사항은 원래 구조체에 직접 반영됩니다.
가치 증명 의미
이는 관련된 구조체의 메모리 주소를 인쇄하여 설명할 수 있습니다. :
package main import "fmt" type T struct { Val string } func (t T) SetVal(s string) { fmt.Printf("Address of copy is %p\n", &t) } func (t *T) SetVal2(s string) { fmt.Printf("Pointer argument is %p\n", t) } func main() { v := T{"abc"} fmt.Printf("Address of v is %p\n", &v) v.SetVal("pdq") v.SetVal2("xyz") }
이 코드는 출력을 생성합니다. resembling:
Address of v is 0xf840001290 Address of copy is 0xf8400013e0 Pointer argument is 0xf840001290
인쇄된 첫 번째와 세 번째 주소가 동일하므로 동일한 구조체를 참조한다는 것을 나타냅니다. 그러나 두 번째 주소는 SetVal 내에서 생성된 임시 복사본을 나타내므로 다릅니다.
위 내용은 내 Go 구조체 설정기 함수가 원래 구조체를 수정하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!