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