首页  >  文章  >  后端开发  >  为什么 Go 的接口 Setter 方法需要指针?

为什么 Go 的接口 Setter 方法需要指针?

Barbara Streisand
Barbara Streisand原创
2024-11-23 11:35:26137浏览

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