Golang의 포인터 수신기 및 인터페이스 구현
Go에서 수신기 기능을 사용하면 메소드가 특정 유형에서 작동할 수 있습니다. 메서드에 포인터 수신기가 있는 경우 구조체의 실제 인스턴스를 수정할 수 있습니다.
문제 이해
다음 코드 조각을 고려하세요.
type IFace interface { SetSomeField(newValue string) GetSomeField() string } type Implementation struct { someField string } // Method with non-pointer receiver func (i Implementation) GetSomeField() string { return i.someField } // Method with non-pointer receiver func (i Implementation) SetSomeField(newValue string) { i.someField = newValue }
이 코드에서는 두 메서드 모두 포인터가 아닌 수신기를 갖습니다. 이는 SetSomeField를 호출할 때 구조체의 복사본을 만들고 해당 복사본을 수정한다는 의미입니다. 원본 인스턴스는 변경되지 않은 상태로 유지됩니다.
포인터 수신기 사용
실제 인스턴스를 변경하려면 SetSomeField 메서드에 포인터 수신기가 있어야 합니다.
// Method with pointer receiver func (i *Implementation) SetSomeField(newValue string) { i.someField = newValue }
이제 SetSomeField는 원본 인스턴스를 수정할 수 있습니다. 그러나 이로 인해 IFace 인터페이스를 구현할 때 문제가 발생합니다.
package main import ( "fmt" ) type IFace interface { SetSomeField(newValue string) GetSomeField() string } type Implementation struct { someField string } // Method with pointer receiver func (i *Implementation) GetSomeField() string { return i.someField } // Method with pointer receiver func (i *Implementation) SetSomeField(newValue string) { i.someField = newValue } func Create() IFace { obj := Implementation{someField: "Hello"} return obj // Offending line } func main() { a := Create() // Assigning an Implementation value to an IFace variable a.SetSomeField("World") // Will panic because a is an Implementation value, not a pointer fmt.Println(a.GetSomeField()) }
Create가 이에 대한 포인터가 아닌 구현 값을 반환하기 때문에 이 코드를 컴파일하면 패닉이 발생합니다. 포인터 수신기로 인터페이스를 구현하려면 메서드를 포인터 수신기로 선언해야 하며 Create 함수가 구현에 대한 포인터를 반환해야 합니다.
type IFace interface { SetSomeField(newValue string) GetSomeField() string } type Implementation struct { someField string } // Method with pointer receiver func (i *Implementation) GetSomeField() string { return i.someField } // Method with pointer receiver func (i *Implementation) SetSomeField(newValue string) { i.someField = newValue } func Create() *Implementation { obj := Implementation{someField: "Hello"} return &obj } func main() { var a IFace a = Create() // Now assigning a pointer to Implementation to an IFace variable a.SetSomeField("World") fmt.Println(a.GetSomeField()) }
이제 a는 구현 값에 대한 포인터입니다. 포인터 수신기를 사용하여 IFace를 구현합니다. SetSomeField를 통해 변경된 내용은 원본 인스턴스에 영향을 미칩니다.
위 내용은 Go 인터페이스 구현에서 포인터 수신기를 사용하려면 포인터 반환이 필요한 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!