>백엔드 개발 >Golang >포인터 수신기를 사용하지 않는 한 내 Go 메서드가 인스턴스 값을 수정하지 않는 이유는 무엇입니까?

포인터 수신기를 사용하지 않는 한 내 Go 메서드가 인스턴스 값을 수정하지 않는 이유는 무엇입니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-08 22:11:12291검색

Why Doesn't My Go Method Modify the Instance Value Unless I Use a Pointer Receiver?

포인터 수신기를 사용한 Golang 메소드

메서드를 통해 인스턴스의 값을 수정하려고 할 때 포인터의 개념을 이해하는 것이 중요합니다. 수신기. 이 예에서는 수신기가 포인터 유형이 아니기 때문에 SetSomeField 메서드가 예상대로 작동하지 않습니다.

이를 수정하기 위해 다음과 같이 포인터 수신기를 허용하도록 SetSomeField 메서드를 수정합니다.

func (i *Implementation) SetSomeField(newValue string) {
    ...
}

그러나 이 변경으로 인해 새로운 문제가 발생합니다. GetSomeField 메서드에 여전히 값이 있기 때문에 구조체는 더 이상 인터페이스를 구현하지 않습니다.

해법은 인터페이스를 구현할 때 구조체에 대한 포인터를 사용하는 것입니다. 이렇게 하면 복사본을 생성하지 않고도 실제 인스턴스를 수정할 수 있는 메서드가 활성화됩니다. 수정된 코드는 다음과 같습니다.

type IFace interface {
    SetSomeField(newValue string)
    GetSomeField() string
}

type Implementation struct {
    someField string
}

func (i *Implementation) GetSomeField() string {
    return i.someField
}

func (i *Implementation) SetSomeField(newValue string) {
    i.someField = newValue
}

func Create() *Implementation {
    return &Implementation{someField: "Hello"}
}

func main() {
    var a IFace
    a = Create()
    a.SetSomeField("World")
    fmt.Println(a.GetSomeField())
}

이 업데이트된 코드에서 Create 함수는 IFace 인터페이스를 구현하는 구현 구조체에 대한 포인터를 반환합니다. 결과적으로 IFace 유형의 변수는 구현 구조체에 대한 포인터를 참조할 수 있으므로 SetSomeField 메서드가 해당 값을 수정할 수 있습니다.

위 내용은 포인터 수신기를 사용하지 않는 한 내 Go 메서드가 인스턴스 값을 수정하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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