假设我们有以下代码
package main
type I1 interface {
Foo() string
}
type I2 interface {
Bar() I1
}
type S1 struct{}
func (s *S1) Foo() string {
return "foo"
}
type S2 struct{}
func (s *S2) Bar() *S1 {
return &S1{}
}
func main() {
x := &S2{}
var i I1 = x.Bar()
println(i.Foo())
var y I2
y = &S2{}
println(y.Bar().Foo())
}
现在,从我的观点来看,S2
满足I2
,因为Bar()
的返回满足I1
,如上面的行所示,但是编译器与我不同意:
# command-line-arguments
./main.go:28:4: cannot use S2 literal (type *S2) as type I2 in assignment:
*S2 does not implement I2 (wrong type for Bar method)
have Bar() *S1
want Bar() I1
是的,我知道它们是不同的类型†,但这不是接受满足其要求的 any 类型的接口的意义吗?>
有人可以提供更多有关此阶段未考虑界面满意度的技术原因的信息吗?
答案 0 :(得分:1)
因为方法签名不匹配,所以接口不令人满意。接口中指定的方法签名为: Bar()I1 但是提供的方法签名是: Bar()* S1
您仍然可以返回指向S1实例的指针,但是您需要方法签名来匹配。将方法的返回类型更改为 I1 。