亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在具體結構中嵌入 (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 關注
  • 117 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號