了解Go 介面實現的接收者類型
在Go 中,方法可以有任一值接收者(func (t T) m())或struct 類型的指標接收器(func (t *T) m())。接收者類型決定了呼叫方法時應使用的值。
考慮以下程式碼:
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 }
您可能想知道為什麼可以使用變數t1 呼叫tourGuide 的方法tourGuide 類型或*tourGuide 類型的指標t2,但不能將t1 指派給類型為g1 的介面變數greeter.
原因在於介面方法的接收者類型。在這種情況下,hello 和 goodbye 都有指標接收器。因此,只有指標值可以用作接收器值。
當您呼叫 t1.hello() 和 t1.goodbye() 時,編譯器會自動取得 t1 的位址並將其用作接收器,因為 t1 是可尋址的值。
但是,當您嘗試將 t1 指派給 g1 時,編譯器會發現 t1 不是指標值,而是tourGuide 類型的值。介面是不可尋址的,因此編譯器無法取得 t1 的位址並將其指派給 g1。
總之,指標接收器需要指標值來呼叫方法,而值接收器可以使用值來呼叫或指標。當使用指標接收器方法實作介面時,只能將指標值指派給介面。
以上是為什麼我無法在 Go 中使用指標接收器方法將值接收器指派給介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!