다음 Go 코드 예를 보면:
package main import "fmt" type greeter interface { hello() goodbye() } type tourGuide struct { name string } func (t tourGuide) hello() { fmt.Println("Hello", t.name) } func (t *tourGuide) goodbye() { fmt.Println("Goodbye", t.name) } func main() { var t1 tourGuide = tourGuide{"James"} t1.hello() // Hello James t1.goodbye() // Goodbye James (same as (&t1).goodbye()) var t2 *tourGuide = &tourGuide{"Smith"} t2.hello() // Hello Smith t2.goodbye() // Goodbye Smith (same as (*t2).hello()) // illegal: t1 is not assignable to g1 (why?) // var g1 greeter = t1 var g2 greeter = t2 g2.hello() // Hello Smith g2.goodbye() // Goodbye Smith }
위 코드에서 다음을 수행할 수 있습니다. TourGuide 유형(t1)의 변수 또는tourGuide에 대한 포인터를 사용하여 structtourGuide의 두 가지 메서드를 호출합니다. (t2). 그러나 인터페이스를 구현하면 상황이 달라집니다. Greetingr 인터페이스 유형의 변수는 포인터에서tourGuide로 할당할 수 있지만,tourGuide 값에서는 할당할 수 없습니다. 왜 그럴까요?
이유를 이해하려면 수신자 유형의 개념과 값 의미를 이해하는 것이 중요합니다. Go의 메소드에는 값 수신자 또는 포인터 수신자가 있을 수 있습니다. 값 수신자 메서드는 값 복사본에서 호출되는 반면 포인터 수신자 메서드는 원래 값에서 호출됩니다.
값이 복사되면 원래 값의 독립적인 새 복사본이 생성됩니다. 복사본을 수정해도 원래 값에는 영향을 미치지 않습니다. 이를 값 의미론이라고 합니다.
tourGuide 예에서 hello 메소드에는 값 수신자가 있고, 안녕 메소드에는 포인터 수신자가 있습니다. t1.hello()를 호출하면 t1의 복사본이 생성되고 해당 복사본에서 hello 메서드가 호출됩니다. t1.goodbye()를 호출하면 원래 t1 값에 대해 작별 메소드가 호출됩니다.
Go의 인터페이스는 값 의미에 의해 구현됩니다. 즉, 값이 인터페이스에 할당되면 해당 값의 복사본이 생성됩니다. 포인터 수신자 메서드의 경우 이는 값의 복사본에 주소가 없으므로 해당 메서드를 호출할 수 없음을 의미합니다.
예를 들어, t1을 g1에 할당하면( 는 인터페이스 값) 다음 코드 줄에서:
// illegal: t1 is not assignable to g1 (why?) // var g1 greeter = t1
t1의 복사본이 생성되고 hello 및 안녕 메서드가 복사본에 구현됩니다. 그러나 복사본에는 주소가 없으므로 작별 인사 메서드를 호출할 수 없습니다.
반대로 다음 코드 줄에서 t2를 g2에 할당하는 경우:
var g2 greeter = t2
t2의 복사본(tourGuide에 대한 포인터)이 생성되고 hello 및 안녕 메서드가 포인터 복사본에 구현됩니다. 이 경우 포인터의 복사본에는 주소가 있으므로 그에 대해 작별 인사 메소드를 호출할 수 있습니다.
요약하면, Greetingr 인터페이스 유형의 변수를 할당할 수 있는 이유 TourGuide에 대한 포인터는 있지만 TourGuide 값에서는 그렇지 않은 이유는 인터페이스가 값 의미론에 의해 구현되기 때문입니다. 인터페이스에 값이 할당되면 해당 값의 복사본이 생성되고, 인터페이스의 메서드에 포인터 수신기가 있는 경우 복사본에 주소가 없기 때문에 복사본에서 호출할 수 없습니다.
위 내용은 Go `greeter` 인터페이스에 `tourGuide` 값을 할당할 수 없지만 `tourGuide`에 대한 포인터를 할당할 수 있는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!