1 回答

TA貢獻1811條經驗 獲得超6個贊
您可以將約束與聯合一起使用,但唯一有意義的約束是:
type Indexable interface {
~[]byte | ~string
}
func GetAt[T Indexable](v T, i int) byte {
return v[i]
}
暫時就是這樣。為什么?
對具有聯合約束的類型所允許的操作僅適用于約束類型集中的所有類型。
要允許索引,聯合中的類型必須具有相等的鍵類型和相等的元素類型。
類型參數提案建議
map[int]T
可以在與 的聯合中使用[]T
,但是這已被禁止。規范現在在索引表達式中提到了這一點:“如果 P 的類型集中存在映射類型,則該類型集中的所有類型都必須是映射類型,并且相應的鍵類型必須全部相同”。對于數組,長度是類型的一部分,因此聯合必須指定您想要處理的所有可能的長度,例如
[1]T | [2]T
等。非常不切實際,并且容易出現越界問題(有一個改進這一點的建議)。
因此,唯一支持索引的具有多種類型的聯合似乎是[]byte | string
(可能近似~
)。由于byte
是 的別名uint8
,您也可以使用 進行實例化[]uint8
。
除此之外,沒有其他方法可以定義支持對所有可能的可索引類型進行索引的約束。
注意支持[]byte | string
索引但不支持范圍,因為這個聯合沒有核心類型。
游樂場:https ://gotipplay.golang.org/p/uatvtMo_mrZ
- 1 回答
- 0 關注
- 114 瀏覽
添加回答
舉報