interface 嵌套 interface 遇到的问题

2020-03-08 10:55:01 +08:00
 input2output

标题表述可能不准确,直接上代码
比如

type I interface {
	Double() I
}

type T int

func (t T) Double() T {
	return t*2
}

没有办法满足这个条件

想请教一下各位,如果想实现这类操作,该如何处理,谢谢

2428 次点击
所在节点    Go 编程语言
6 条回复
input2output
2020-03-08 11:08:25 +08:00
64 views, 0 replies
hst001
2020-03-08 11:09:40 +08:00
func (t T) Double() I {
return T(t*2)
}
Buges
2020-03-08 11:28:26 +08:00
两个函数类型都不一样当然匹配不了
两种办法,一种是接收器改成指针*T 直接修改,去掉返回值。
如果你非要传值的话,可以包装一层空的 interface{},使用时再释放出来,如下:

type IT interface{
Foo() interface{}
}

type CT int

func (c CT)Foo() interface{} {
return interface{}(c*2)
}

func main(){
var v IT = CT(2)
v = v.Foo().(IT)
}



楼上那种做法比较 expedient,如果要满足多个 interface 就不行了。
reus
2020-03-08 11:36:32 +08:00
接口方法的签名必须一致,不支持协变 /逆变。
TypeErrorNone
2020-03-08 12:15:57 +08:00
package main

import "fmt"

type People interface {
Get() People
}

type Teacher struct {

}

func (Teacher) Get() People {
return Teacher{}
}

func main() {

t := Teacher{}
fmt.Println(t.Get())

}
janxin
2020-03-08 12:26:25 +08:00
指纹需要完全一致,你返回需要返回 I

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/650855

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX