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

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

comparable 和 any 有什么區別?

comparable 和 any 有什么區別?

Go
互換的青春 2022-11-23 15:58:29
我曾嘗試在 Go 中使用泛型,但我真的不明白我們何時使用anyorcomparable作為類型參數。有人可以幫助理解這些嗎?
查看完整描述

1 回答

?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

這取決于您要使用什么/如何使用參數類型的值。約束限制了您可以對這些類型的值執行的操作。


any是interface{}允許任何類型的別名。如果一個參數可以是任何類型,那基本上不允許你用它做任何事情,因為你不能保證它會是什么。


約束只允許可比較的comparable類型,也就是說,允許==和!=運算符在它們的值上使用。如果你想使用類型作為映射中的鍵(映射要求鍵類型是可比較的),或者如果你想在切片中查找元素,并且你想使用==運算符來比較元素,這很好到某事。


例如,讓我們編寫一個通用的 map-get 函數:


func get[K comparable, V any](m map[K]V, key K) V {

    return m[key]

}

K鍵類型必須是comparable,否則不能作為某些映射的鍵類型(在m[K]V示例中)。V另一方面不應該被約束,值類型可以是任何東西,我們沒有對它做任何事情(只是返回一個 type 的值V),所以any在這里使用是最好的選擇。


另一個例子,一個 slice-find 函數:


func find[V comparable](what V, s []V) int {

    for i, v := range s {

        if v == what {

            return i

        }

    }

    return -1

}

find()what返回slice中第一次出現的索引s,如果它不在 slice 中,則返回-1。這里的類型參數V必須是comparable,否則不能寫v == what, usingV any會報編譯時錯誤。該約束comparable確保此find()函數只能使用==定義和允許運算符的類型實例化(并使用值調用)。


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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