关于这个" X没有实现Y(...方法有一个指针接收器) "的事情,已经有几个问答,但对我来说,他们似乎在谈论不同的事情,而不是适用于我的具体案例.
因此,我没有将问题变得非常具体,而是将其广泛和抽象化 - 似乎有几个不同的案例可以使这个错误发生,有人可以总结一下吗?
即,如何避免这个问题,如果发生,有什么可能性?谢谢.
引用golang wiki(https://github.com/golang/go/wiki/MethodSets#interfaces):
"存储在接口中的具体值不可寻址,就像地图元素不可寻址一样."
这里解释了地图值不可寻址的问题: 为什么地图值不可寻址?
但是,关于界面还不清楚.为什么他们无法解决?这是因为一些硬设计假设吗?
阅读有关Web和stackoverflow上的值接收器与指针接收器的信息,我了解以下基本规则:如果您不打算修改接收器,并且接收器相对较小,则不需要指针。
然后,阅读有关实现error接口的信息(例如https://blog.golang.org/error-handling-and-go),我看到该Error()函数的示例全部使用指针接收器。
但是,我们没有修改接收器,结构非常小。
我觉得没有指针(return &appError{}vs return appError{})的代码会更好。
示例使用指针有原因吗?
我想在以下代码中摆脱变量temp:
type myinterface interface {
f1()
}
type a struct {
val int
}
type b struct {
mi *myinterface
}
func (a) f1() {
}
func demo() {
a1 := a{3}
var temp myinterface = a1
b1 := b{&temp}
fmt.Println(b1)
Run Code Online (Sandbox Code Playgroud)
但如果我试着写
b1 := b{&myinterface(a1)}
Run Code Online (Sandbox Code Playgroud)
我收到了消息
不能取myinterface的地址(a1)(undefined)
这样做的正确方法是什么?
更新:
我没有指向接口的指针,因为接口可以包含结构或指向结构的指针,这也在这个问题中详述: