포인터 수신기를 사용한 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!