为了账号安全,请及时绑定邮箱和手机立即绑定

如何解决“接口方法必须没有类型参数”?

如何解决“接口方法必须没有类型参数”?

Go
拉莫斯之舞 2022-11-08 16:05:27
我正在尝试在 1.18beta2 中使用泛型,并且正在尝试为键/值存储 boltdb 编写一个抽象层。这就是我试图用它实现的目标。type Reader interface {    Read(bucket []byte, k ...[]byte) ([][]byte, error)    ReadDoc[V Unmarshaler](bucket []byte, factory func() (V, error), k ...[]byte) ([]V, error)}type Unmarshaler interface {    UnmarshalKV(v []byte) error}这样我就可以为它提供一个工厂来在它找到键/值时创建类型,将数据解组到其中并返回该特定类型的切片。只有我从编译器得到“接口方法必须没有类型参数”。为什么接口中不允许类型参数?是否有计划支持这个?这粉碎了我的梦想......本来是完美的。然而,它确实在界面之外工作。
查看完整描述

1 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

今天早些时候遇到了同样的问题。这似乎是泛型/类型参数的设计决策,因为在接口定义(和实现工作)中可能有多种解释具有类型参数的方法的“方式”。

在某些情况下,它可能意味着:

  • 不保留参数的身份。

  • 需要在编译时遍历整个树,这会影响性能。

  • 需要在运行时进行反射,这会影响性能。

  • 参数化方法不实现接口,这会导致混乱。

类型参数提案中的更多信息,无参数化方法

但是,您可以将类型参数移动到接口类型定义中。建议,非常高级的概述

type Reader[V Unmarshaler] interface {

    Read(bucket []byte, k ...[]byte) ([][]byte, error)

    ReadDoc(bucket []byte, factory func() (V, error), k ...[]byte) ([]V, error)

}


type Unmarshaler interface {

    UnmarshalKV(v []byte) error

}


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信