滿足介面的Go 結構體方法類型
在Go 中,結構體可以具有不同接收器類型(值或指標)的方法。雖然可以在結構體的值或指標上呼叫具有值接收器的方法,但具有指標接收器的方法需要指標接收器。
考慮提供的範例:
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) }
我們可以使用值 t1 和指標 t2 來呼叫tourGuide 的方法。但是,在實作介面時,不允許將tourGuide值指派給greeter介面變數。
這樣做的原因是,如果一個方法有指標接收器,則只能使用指標值作為接收器。由於介面值是包裝值的副本並且不可尋址,因此它們無法傳遞給具有指標接收器的方法。
此限制可以防止透過指標接收器進行的修改只會影響介面中的副本的潛在問題,而不是原始值。
因此,對於接受值類型的接口,其所有方法都必須具有值接收器。在我們的例子中,由於goodbye有一個指標接收器,所以tourGuide不能被指派給greeter。
以上是為什麼帶有指標接收器方法的 Go 結構不能滿足介面?的詳細內容。更多資訊請關注PHP中文網其他相關文章!