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

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

如何滿足通過嵌入泛型實現的約束?

如何滿足通過嵌入泛型實現的約束?

Go
楊魅力 2022-12-26 15:41:37
我有一個界面type FooInterface interface {    HasName() bool}它有一個我打算在 FooInterface 的其他實現中使用的基本實現type FooBoilerplate struct {    hasName bool}func (f *FooBoilerplate) HasName() bool {    return f.hasName}像這樣type Foo1 struct {    fooId int    FooBoilerplate}func (f *Foo1) GetId() int {    return f.fooId}我想使用泛型為 FooInterface 創建一個容器類type FooContainer[T FooInterface] struct {    list []T}func (fc *FooContainer[T]) AddItem() {    var t T    fc.list = append(fc.list, t)}但是,當我嘗試實例化容器時出現編譯錯誤func RunThis() {    foo1 := Foo1{FooBoilerplate: FooBoilerplate{hasName: false}}    // works fine    TakesFooInterface(&foo1)    // doesnt compile    fc := FooContainer[Foo1]{}    fc.AddItem()}不確定為什么 Foo1 在傳遞給函數時被視為實現 FooInterface,但在傳遞給容器結構時卻沒有。我也不能將對象傳遞給容器實例化。
查看完整描述

2 回答

?
神不在的星期二

TA貢獻1963條經驗 獲得超6個贊

Foo1不執行FooInterface。*Foo1做。無論接口是用作函數參數的類型還是用作約束,都是如此。

這就是為什么您將&foo1(type *Foo1) 傳遞給TakesFooInterface而不是foo1(type Foo1) 的原因。

同樣對于類型參數,您應該實例化通用類型*Foo1

fc := FooContainer[*Foo1]{}


查看完整回答
反對 回復 2022-12-26
?
jeck貓

TA貢獻1909條經驗 獲得超7個贊

我假設你的 TakesFooInterface 是這樣的:

func TakesFooInterface(foo1 FooInterface) {
   ...
}

然后調用 TakesFooInterface(foo1) 編譯失敗,因為 foo1 沒有實現 FooInterface,而是 &foo1。

與您的一般情況相同,該Foo1類型沒有實現 FooInterface ,它需要在方法中訪問指針,HasName*Foo1類型需要。

我已經在 Go.Dev 上復制了你的代碼和一些嘗試:https ://go.dev/play/p/3I2mtabi-ub


查看完整回答
反對 回復 2022-12-26
  • 2 回答
  • 0 關注
  • 111 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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