首页 >后端开发 >Golang >为什么 Go 接口不能直接支持 Setter 方法,如何解决这个问题?

为什么 Go 接口不能直接支持 Setter 方法,如何解决这个问题?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-25 00:50:14298浏览

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