## 왜 Go에서 포인터 수신기가 있는 유형의 인스턴스를 복사할 수 없나요?

Linda Hamilton
풀어 주다: 2024-10-25 05:03:02
원래의
179명이 탐색했습니다.

## Why Can't I Just Copy Instances of Types With Pointer Receivers in Go?

포인터 수신기 이해 및 인스턴스 복사

Go에서는 값 수신기 또는 포인터 수신기를 사용하여 메서드를 정의할 수 있습니다. T 유형의 모든 메소드에 T 자체의 수신자 유형이 있는 경우 해당 메소드를 호출하면 반드시 복사가 이루어지므로 해당 유형의 인스턴스를 복사하는 것이 안전합니다.

그러나 유형이 포인터 수신기를 사용하는 메서드가 있습니다. 이 경우 해당 유형의 인스턴스 복사는 내부 불변성을 위반할 수 있으므로 피해야 합니다.

포인터 복사 문제

예를 들어 설명하겠습니다. 문제. 값 v와 포인터 p라는 두 개의 필드가 있는 Wrapper 유형이 있다고 가정합니다. 우리는 v와 p의 지정된 값 모두에 동일한 숫자를 저장하려고 합니다. 이를 보장하기 위해 포인터 수신기가 있는 Set 메서드를 제공합니다.

<code class="go">type Wrapper struct {
    v int
    p *int
}

func (w *Wrapper) Set(v int) {
    w.v = v
    *w.p = v
}</code>
로그인 후 복사

Wrapper 인스턴스가 있고 Set 메서드를 호출하면 p의 지정된 값이 수정됩니다. 그러나 인스턴스의 복사본을 만들면 복사본은 원본 인스턴스와 동일한 포인터 값 p를 공유합니다. 즉, 각 인스턴스에 대한 후속 메서드 호출은 두 복사본 모두에 영향을 미칩니다.

예:

<code class="go">a := Wrapper{v: 0, p: new(int)}
b := a

fmt.Printf("a.v=%d, a.p=%d;  b.v=%d, b.p=%d\n", a.v, *a.p, b.v, *b.p)

a.Set(1)
fmt.Printf("a.v=%d, a.p=%d;  b.v=%d, b.p=%d\n", a.v, *a.p, b.v, *b.p)</code>
로그인 후 복사

출력:

a.v=0, a.p=0;  b.v=0, b.p=0
a.v=1, a.p=1;  b.v=0, b.p=1
로그인 후 복사

In 이 예에서는 b.v가 *b.p와 같지 않기 때문에 a.Set(1)이 호출된 후에 b 값이 유효하지 않게 됩니다. 이는 a와 b 모두의 포인터 p가 동일한 기본 값을 가리키기 때문입니다.

이러한 문제를 피하려면 포인터 수신기와 함께 메서드를 사용할 때 포인터 값으로 작업하는 것이 좋습니다. 또는 유형에 값 수신자만 있을 수 있는 경우 메소드 호출에 관계없이 해당 유형의 인스턴스를 복사하는 것이 안전합니다.

위 내용은 ## 왜 Go에서 포인터 수신기가 있는 유형의 인스턴스를 복사할 수 없나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!