Go에서 구조체 역참조: 새 복사본 생성
Go에서 구조체로 작업할 때 역참조 동작을 이해하는 것이 중요합니다. 객체를 역참조하면 본질적으로 객체가 가리키는 값의 복사본이 반환됩니다. 역참조가 일반적으로 객체 자체를 반환하는 다른 언어를 사용하는 일부 프로그래머에게는 이는 직관에 어긋날 수 있습니다.
다음 Go 코드 조각을 고려하세요.
package main import ( "fmt" ) type me struct { color string total int } func study() *me { p := me{} p.color = "tomato" fmt.Printf("%p\n", &p.color) return &p } func main() { p := study() fmt.Printf("&p.color = %p\n", &p.color) obj := *p fmt.Printf("&obj.color = %p\n", &obj.color) fmt.Printf("obj = %+v\n", obj) p.color = "purple" fmt.Printf("p.color = %p\n", &p.color) fmt.Printf("p = %+v\n", p) fmt.Printf("obj = %+v\n", obj) obj2 := *p fmt.Printf("obj2 = %+v\n", obj2) }
이 예에서 Study() 함수는 새로운 me 구조체를 생성하고 이에 대한 포인터를 반환합니다. 그런 다음 이 포인터를 변수 p에 할당합니다. p를 역참조하고 이를 obj에 할당하면 구조체의 새 복사본이 생성됩니다. 이 새 복사본은 p가 가리키는 원래 구조체와 다른 메모리 주소를 갖습니다.
이는 obj의 필드를 변경해도 원래 구조체의 필드에 영향을 주지 않으며 그 반대의 경우도 마찬가지라는 의미입니다. 원래 구조체에 대한 참조를 만들려면 p에서 obj로 포인터를 할당해야 합니다.
obj := p
이 경우 obj와 p는 동일한 구조체를 가리키며 하나에 대한 모든 변경 사항은 다음과 같습니다. 다른 사람에게 반영됩니다.
위 내용은 Go 구조체를 역참조하면 복사본이 생성되나요, 아니면 참조가 생성되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!