首頁  >  文章  >  後端開發  >  為什麼 Go 的介面 Setter 方法需要指標?

為什麼 Go 的介面 Setter 方法需要指標?

Barbara Streisand
Barbara Streisand原創
2024-11-23 11:35:26117瀏覽

Why Do Go's Interface Setter Methods Require Pointers?

Go 中的多態性:介面實現

雖然Go 不支援傳統的多態性,但介面提供了一種實現類似效果的方法。但是,在實作 setter 方法時存在限制。

問題

考慮以下程式碼:

type MyInterfacer interface {
    Get() int
    Set(i int)
}

type MyStruct struct {
    data int
}

func (this MyStruct) Get() int {
    return this.data
}

嘗試實作 Set方法結果在一個錯誤:

func (this MyStruct) Set(i int) {
    this.data = i
}

解決方案

要規避此限制,Set 方法中的接收者必須是指針,如下所示:

func (this *MyStruct) Set(i int) {
    this.data = i
}

這允許方法修改底層數據,這反映在介面中

修正的程式碼

以下更正後的程式碼按預期工作:

type MyInterfacer interface {
    Get() int
    Set(i int)
}

type MyStruct struct {
    data int
}

func (this *MyStruct) Get() int {
    return this.data
}

func (this *MyStruct) Set(i int) {
    this.data = i
}

func main() {
    s := &MyStruct{123}
    fmt.Println(s.Get())

    s.Set(456)
    fmt.Println(s.Get())

    var mi MyInterfacer = s
    mi.Set(789)
    fmt.Println(mi.Get())
}

雖然不是真正的多態性,但此技術允許類似的透過Go 中的介面實現實現靈活性。

以上是為什麼 Go 的介面 Setter 方法需要指標?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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