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