自 1.18 引入泛型以來,我決定深入研究 Go。我想實作一個只接受順序型別的演算法——陣列、切片、映射、字串,但我不知道如何破解。
是否有一種可以針對涉及可索引性的方法?
uj5u.com熱心網友回復:
您可以將約束與聯合一起使用,但唯一有意義的約束是:
type Indexable interface {
~[]byte | ~string
}
func GetAt[T Indexable](v T, i int) byte {
return v[i]
}
暫時就是這樣。為什么?
對具有聯合約束的型別所允許的操作僅適用于約束型別集中的所有型別。
要允許索引,聯合中的型別必須具有相等的鍵型別和相等的元素型別。
型別引數提議建議
map[int]T可以在聯合中使用[]T- 鑒于切片必須用 索引int,但是這是不允許的。對于陣列,長度是型別的一部分,因此聯合必須指定您想要處理的所有可能的長度,例如
[1]T | [2]T等。非常不切實際,并且容易出現越界問題(有一個改進這一點的建議)。
因此,唯一支持索引的具有多種型別的聯合似乎是[]byte | string(可能近似~)。由于byte是 的別名uint8,您也可以使用 進行實體化[]uint8。
除此之外,似乎沒有其他方法可以定義支持對所有可能的可索引型別進行索引的約束。
[]byte | string支持索引但不支持范圍的注意,因為在字串上進行范圍會產生rune,而不是byte。
游樂場:https ://gotipplay.golang.org/p/uatvtMo_mrZ
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/437855.html
上一篇:方法參考運算式“精確”的條件
下一篇:流中的Java泛型
