首頁 >後端開發 >Golang >Go 介面中的值與指標接收器:介面分配何時失敗?

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

Susan Sarandon
Susan Sarandon原創
2024-11-19 15:02:02985瀏覽

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn