首頁 >後端開發 >Golang >為什麼 Go 介面不能直接支援 Setter 方法,如何解決這個問題?

為什麼 Go 介面不能直接支援 Setter 方法,如何解決這個問題?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-25 00:50:14262瀏覽

Why Can't Go Interfaces Directly Support Setter Methods, and How Can This Be Worked Around?

Go 中的多態性:仔細觀察介面方法和指標接收器

Go 本身不支援多態性,但可以透過使用介面實現。這就引入了一個常見問題:為什麼介面不允許使用 setter 方法?

如提供的程式碼所示,當 setter 方法定義為值接收器時,函數內所做的變更在退出時會遺失。將接收器修改為指標接收器可以實現永久更改,但會引發編譯錯誤。

為了解決這個問題,Go 提供了一個解決方法。更正後的程式碼將setter方法的接收者修改為指標。這使得該函數能夠修改底層資料結構並保留變更。修改後的程式碼使用了接口,確保可以透過接口存取指針接收器方法。

package main

import "fmt"

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 介面不能直接支援 Setter 方法,如何解決這個問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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