gpt4 book ai didi

Go 接口(interface)方法返回一个指向自身的指针

转载 作者:行者123 更新时间:2023-12-01 22:35:51 25 4
gpt4 key购买 nike

我正在使用 Go 中的上游包,它提供了一个典型的具有返回指向相同结构的指针的方法(如典型的构建器模式)。例如:

type Dog struct {
AddCollar() *Dog
}
出于某些原因,我想在某些场景中模拟这种结构(例如用于本地开发,或者当某些 Dog 属性不存在时等...)。
我决定制作一个通用接口(interface):
type Animal interface {
AddCollar() Animal
}
我的第一 react 是返回 Animal在这里,不是 *Animal ,因为指向接口(interface)的指针似乎没有意义(而且似乎也不起作用)。
我的模拟很简单,实际上什么也没做(相比之下,上游 Dog 会做更多在这种情况下不需要的工作):
type DogMock struct{}
func (d *DogMock) AddCollar() *DogMock {return d}
然而,在写下并尝试使用我的模拟结构之后,我得到:
need method: AddCollar() Animal
have method: AddCollar() *DogMock
但是我的 *DogMock对象实际上实现了 Animal .
两个签名都返回相同的错误:
type DogMock struct{}
func (d *DogMock) AddCollar() *DogMock {return d}
func (d *DogMock) AddCollar() Animal {return d}
请注意 func (d *DogMock) AddCollar() Animal {return d}似乎不是解决方案,因为我无法编辑上游结构 Dog , 使用方法 AddCollar()返回 *Dog ,而不是 Animal .
有没有办法在我的 Animal 中指定接口(interface)返回指向其自身结构的指针?

最佳答案

你的 DogMock 只需要返回 Animal。一旦 DogMock 返回 Animal,那么它就是 Animal,您可以将 *DogMock 作为 Animal 返回。

package main

import "fmt"

type Animal interface {
AddCollar() Animal
AddLeash() Animal
}

type Dog struct {
HasCollar bool
HasLeash bool
}

func (d *Dog) AddCollar() Animal {
d.HasCollar = true
return d
}

func (d *Dog) AddLeash() Animal {
d.HasLeash = true
return d
}

func main() {
var a Animal = &Dog{}

fmt.Printf("%#v\n", a)
a.AddCollar().AddLeash()
fmt.Printf("%#v\n", a)
}

关于Go 接口(interface)方法返回一个指向自身的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63264153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com