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

Go 介面中的值與指標接收器:介面分配何時失敗?

Susan Sarandon
發布: 2024-11-19 15:02:02
原創
919 人瀏覽過

Value vs. Pointer Receivers in Go Interfaces: When Does Interface Assignment Fail?

理解Go 結構方法與介面實作

在Go 中,實作介面的方法可以分為兩種:帶有值接收器的方法以及帶有指標接收器的方法。然而,在實作介面時,介面值的可分配性與直接結構體方法呼叫不同。

考慮提供的程式碼片段:

type greeter interface {
    hello()
    goodbye()
}
登入後複製

greeter 介面定義了兩個方法,hello 和再見。

type tourGuide struct {
    name string
}
登入後複製

tourGuide 結構實作了greeter 介面。

func (t tourGuide) hello() {
    fmt.Println("Hello", t.name)
}
登入後複製

hello 方法有一個值接收器,它允許使用tourGuide 類型的變數直接呼叫方法。

func (t *tourGuide) goodbye() {
    fmt.Println("Goodbye", t.name)
}
登入後複製

Goodbye 方法有一個指標接收器,需要一個指標變數來呼叫。

現在,讓我們檢查一下介面實作:

var g2 greeter = t2
g2.hello()   // Hello Smith
g2.goodbye() // Goodbye Smith
登入後複製

將*tourGuide類型的指標變數t2指派給介面類型greeter的接收者值會成功,因為指標接收者允許取得該值的位址,然後將其用作接收者。

var g1 greeter = t1
登入後複製

但是,將tourGuide類型的非指標變數t1指派給介面類型greeter的接收者值失敗。這是因為帶有指標接收器的方法需要指標接收器,而值本身不能直接用作指標。

總而言之,具有值接收器的方法可以使用值或指標來調用,而帶有指標接收器的方法只能使用指標來調用。當使用具有指標接收器的方法實作介面時,使用指標作為基礎類型至關重要。

以上是Go 介面中的值與指標接收器:介面分配何時失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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