我正在嘗試在 1.18beta2 中使用泛型,并且正在嘗試為鍵/值存盤 boltdb 撰寫一個抽象層。這就是我試圖用它實作的目標。
type Reader interface {
Read(bucket []byte, k ...[]byte) ([][]byte, error)
ReadDoc[V Unmarshaler](bucket []byte, factory func() (V, error), k ...[]byte) ([]V, error)
}
type Unmarshaler interface {
UnmarshalKV(v []byte) error
}
這樣我就可以為它提供一個工廠來在它找到鍵/值時創建型別,將資料解組到其中并回傳該特定型別的切片。只有我從編譯器得到“介面方法必須沒有型別引數”。為什么介面中不允許型別引數?是否有計劃支持這個?這粉碎了我的夢想......本來是完美的。然而,它確實在界面之外作業。
uj5u.com熱心網友回復:
今天早些時候遇到了同樣的問題。這似乎是泛型/型別引數的設計決策,因為在介面定義(和實作作業)中可能有多種“方式”來解釋具有型別引數的方法。
在某些情況下,它可能意味著:
- 不保留引數的身份。
- 需要在編譯時遍歷整個樹,這會影響性能。
- 需要在運行時進行反射,這會影響性能。
- 引數化方法不實作介面,這會導致混亂。
更多資訊
但是,如果這樣可以解決您的問題,您可以將引數型別定義移至介面型別定義。更多資訊
type Reader[V Unmarshaler] interface {
Read(bucket []byte, k ...[]byte) ([][]byte, error)
ReadDoc(bucket []byte, factory func() (V, error), k ...[]byte) ([]V, error)
}
type Unmarshaler interface {
UnmarshalKV(v []byte) error
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424121.html
