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

在具体结构中嵌入 (E) 不满足类型约束 (E)

在具体结构中嵌入 (E) 不满足类型约束 (E)

Go
慕仙森 2022-12-19 20:36:25
我正在尝试为类型参数设计模式实现指针方法示例的变体,以便抽象一些统一的存储库接口。我的印象是该Person结构将继承Entityif it composes的方法集*Entity,但我收到如下编译时错误。有人可以解释为什么不满足类型约束以及如何修复此代码吗?为糟糕的标题道歉;如果有人可以提出改进的摘要,那就太棒了(我对 Go 还很陌生)。谢谢 :)package main// domaintype PEntity[E any] interface {    *E    SetID(id string)}type Entity struct {    ID string}func (e Entity) SetID(id string) {    e.ID = id}type Repository[E Entity, PE PEntity[E]] interface {    Get(id string) *E}// datatype Person struct {    *Entity}type PersonRepository interface {    Repository[Person, *Person] // -> Person does not implement Entity    AddPet(name string)    // ...}
查看完整描述

1 回答

?
暮色呼如

TA贡献1853条经验 获得超9个赞

约束E Entity——语法糖E interface{ Entity }——有效地意味着类型集ofE恰好包含一个类型 term Entity,它是一个结构。

当你有确切的约束时,你只能用那个类型来满足它们,所以它与根本没有类型参数和声明常规函数参数没有太大区别。举个例子帮助你理解:

func Foo[T int](v T) {}

实际上与以下内容相同:

func Foo(v int) {}

E Entity因此,您可以只使用 struct来满足约束Entity

显然Person不是Entity。字段嵌入只影响嵌入类型的方法集,与类型标识无关。

如果将约束更改为仅方法(基本)接口——或者Entity直接更改(游乐场)——,那么它将只考虑方法集并成功编译:

type Repository[E interface{ SetID(id string) }, PE PEntity[E]] interface {
    Get(id string) *E
}


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

添加回答

举报

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