1 回答

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