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

我正在尝试为类型参数设计模式实现指针方法示例的变体,以便抽象一些统一的存储库接口。


我的印象是该Person结构将继承Entityif it composes的方法集*Entity,但我收到如下编译时错误。有人可以解释为什么不满足类型约束以及如何修复此代码吗?


为糟糕的标题道歉;如果有人可以提出改进的摘要,那就太棒了(我对 Go 还很陌生)。


谢谢 :)


package main


// domain


type 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

}


// data


type Person struct {

    *Entity

}


type PersonRepository interface {

    Repository[Person, *Person] // -> Person does not implement Entity

    AddPet(name string)

    // ...

}


慕仙森
浏览 106回答 1
1回答

暮色呼如

约束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 }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go