是否可以撰寫泛型型別約束以使該型別包含回傳相同型別的函式,或者它與普通介面的問題相同?示例用例將是具有可鏈接方法的構建器。
假設我有一個構建器IntFoo,它有一個SetFoo負責將foo欄位設定為某個值的方法。游樂場鏈接
type IntFoo struct {
foo int
}
func (me *IntFoo) SetFoo(foo int) *IntFoo {
me.foo = foo
return me
}
現在我可能有幾個像這樣的不同型別的構建器,我想定義一個這樣的約束:
type Builder[F any] interface {
SetFoo(F) Builder[F] // this return type is problematic
}
以及一些使用 Builder-constrained 型別的函式,如下所示:
// some generic demo function
func demo[E Builder[F], F any](builder E, foo F) {
builder.SetFoo(foo)
return
}
嘗試呼叫演示函式
e := &IntFoo{}
demo(e, 2)
導致錯誤:
[compiler InvalidTypeArg] [E] *IntFoo does not implement Builder[int] (wrong type for method SetFoo)
have SetFoo(foo int) *IntFoo
want SetFoo(int) Builder[int]
uj5u.com熱心網友回復:
您想從您的方法回傳原始型別E- 而不是Builder介面:
type Builder[F, E any] interface {
SetFoo(F) E
}
然后 reworking demo,因此所需的型別E被中繼到Builder型別約束:
func demo[E Builder[F, E], F any](bldr E, foo F) E {
return bldr.SetFoo(foo)
}
https://go.dev/play/p/2K4D_nzMwU2
v := demo(e, 2)
fmt.Printf("%[1]T : % [1]v\n", v) // *main.IntFoo : &{foo:2}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/460200.html
上一篇:當將切片視為迭代器時,為什么編譯器期望雙重參考而不是參考?[復制]
下一篇:快速泛型:未找到陣列的追加
