首頁 > 後端開發 > Golang > 主體

為什麼我無法在 Go 中使用指標接收器方法將值接收器指派給介面?

Linda Hamilton
發布: 2024-11-24 04:15:20
原創
555 人瀏覽過

Why Can't I Assign a Value Receiver to an Interface with Pointer Receiver Methods in Go?

了解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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板