利用 Go 反射機制實現(xiàn)判斷 slice 中是否存在某個 item
為什么需要?
日常開發(fā)過程中經(jīng)常遇到需要判斷某個 slice(或者 array)中是否包含某個 item 的情況,比如判斷 10 是否在[]int{1,2,3}中
怎么做?
一般最容易想到的方法是遍歷 slice 中的每個元素,直到找到了該元素,否則返回 false,如下:
package?main
func?IsInSlice(value?int,?sli?[]int)?bool?{
????for?_,?v?:=?range?sli?{
?????if?value?==?v?{
??????return?true
?????}
????}
????return?false
}
這種方法實現(xiàn)略顯笨拙,并且針對不同的數(shù)據(jù)類型無法通用,如果有不同的數(shù)據(jù)類型,則容易生成很多相同功能的函數(shù),只是參數(shù)不同,這樣的話代碼可用性并不高。
如何改進
golang 中可以通過 reflect 包中的 TypeOf(), ValueOf()和 DeepEqual()接口對方法進行改進,方法參數(shù)使用 interface{}類型,代碼實現(xiàn)如下:
package?main
import?"reflect"
func?IsInSlice(value?interface{},?sli?interface{})?bool?{
????switch?reflect.TypeOf(sli).Kind()?{
????case?reflect.Slice,?reflect.Array:
?????s?:=?reflect.ValueOf(sli)
?????for?i?:=?0;?i???????if?reflect.DeepEqual(value,?s.Index(i).Interface())?{
???????return?true
??????}
?????}
????}
????return?false
}
瞬間不用再為不同數(shù)據(jù)類型需要寫不同函數(shù)而心煩了!
提示
因為反射需要的時間開銷比較大,所以通用寫法的效率肯定比特定類型的寫法低,所以需要根據(jù)實際情況來權衡使用,如下截圖為 int 類型的基準測試:

原文作者:pyihe
原文鏈接:https://pyihe.github.io/2020/05/29/Golang%E5%88%A4%E6%96%ADslice%E4%B8%AD%E6%98%AF%E5%90%A6%E5%AD%98%E5%9C%A8%E6%9F%90%E4%B8%AAitem.html
推薦閱讀
站長 polarisxu
自己的原創(chuàng)文章
不限于 Go 技術
職場和創(chuàng)業(yè)經(jīng)驗
Go語言中文網(wǎng)
每天為你
分享 Go 知識
Go愛好者值得關注
評論
圖片
表情
