」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 我們如何有效地約束 Go 1.18 泛型中的可索引類型?

我們如何有效地約束 Go 1.18 泛型中的可索引類型?

發佈於2024-11-19
瀏覽:668

How Can We Effectively Constrain Indexable Types in Go 1.18 Generics?

Go 1.18 泛型中的索引約束

Go 1.18 泛型中的索引約束

隨著Go 1.18 中泛型的引入,開發人員有機會實現適用於特定類型的演算法類型。常見的要求是使用支援索引的類型,例如陣列、切片、映射和字串。

可索引約束
type Indexable interface {
    ~[]byte | ~string
}
將類型參數限制為可索引類型,考慮使用以下帶有並集的約束:

type Indexable interface { 〜[]位元組| 〜字串 }

可索引約束的限制
  • 雖然上述約束適用於索引字節和字串,但將其與其他可索引類型(例如映射和數組)一起使用時有限制:
  • Maps: 聯合必須僅包含具有相同鍵和元素類型的映射類型。此限制使得必須處理具有不同鍵和值的映射的通用演算法變得不切實際。

陣列: 陣列的長度是其類型的一部分,因此聯合需要指定所有可能的長度。這可能很麻煩並且容易出現越界錯誤。

替代方法

由於這些限制,支持索引的唯一實用聯合是[]字節|細繩。此聯合允許索引操作,但不支援範圍操作,因為它缺少核心類型。

用法範例
type Indexable interface {
    ~[]byte | ~string
}
以下範例示範如何使用Indexable 限制:

func GetAt[T Indexable](v T, i int) byte { 返回 v[i] }這個函數接受一個可索引值和一個索引,並傳回指定索引處的位元組。

結論

How Can We Effectively Constrain Indexable Types in Go 1.18 Generics?

而Go 1.18提供了一種方法使用聯合將類型約束為可索引類型,該約束的局限性意味著它僅適用於有限的用例集,即索引位元組和字串。

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3