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中文网其他相关文章!