亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將類型限制為具有索引的類型?

如何將類型限制為具有索引的類型?

Go
aluckdog 2022-11-08 17:09:51
自 1.18 引入泛型以來,我決定深入研究 Go。我想實現一個只接受順序類型的算法——數組、切片、映射、字符串,但我不知道如何破解。是否有一種可以針對涉及可索引性的方法?
查看完整描述

1 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

您可以將約束與聯合一起使用,但唯一有意義的約束是:


type Indexable interface {

    ~[]byte | ~string

}


func GetAt[T Indexable](v T, i int) byte {

    return v[i]

}

暫時就是這樣。為什么?

  1. 對具有聯合約束的類型所允許的操作僅適用于約束類型集中的所有類型。

  2. 要允許索引,聯合中的類型必須具有相等的鍵類型和相等的元素類型。

  3. 類型參數提案建議map[int]T可以在與 的聯合中使用[]T,但是這已被禁止。規范現在在索引表達式中提到了這一點:“如果 P 的類型集中存在映射類型,則該類型集中的所有類型都必須是映射類型,并且相應的鍵類型必須全部相同”

  4. 對于數組,長度是類型的一部分,因此聯合必須指定您想要處理的所有可能的長度,例如[1]T | [2]T等。非常不切實際,并且容易出現越界問題(有一個改進這一點的建議)。

因此,唯一支持索引的具有多種類型的聯合似乎是[]byte | string(可能近似~)。由于byte是 的別名uint8,您也可以使用 進行實例化[]uint8。

除此之外,沒有其他方法可以定義支持對所有可能的可索引類型進行索引的約束。

注意支持[]byte | string索引但不支持范圍,因為這個聯合沒有核心類型。

游樂場:https ://gotipplay.golang.org/p/uatvtMo_mrZ


查看完整回答
反對 回復 2022-11-08
  • 1 回答
  • 0 關注
  • 114 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號