go 判断元素是否在slice_利用 Go 反射机制实现判断 slice 中是否存在某个 item

为什么需要?

日常开发过程中经常遇到需要判断某个 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

}

这种方法实现略显笨拙,并且针对不同的数据类型无法通用,如果有不同的数据类型,则容易生成很多相同功能的函数,只是参数不同,这样的话代码可用性并不高。

如何改进

golang 中可以通过 reflect 包中的 TypeOf(), ValueOf()和 DeepEqual()接口对方法进行改进,方法参数使用 interface{}类型,代码实现如下: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

}

瞬间不用再为不同数据类型需要写不同函数而心烦了!

提示

因为反射需要的时间开销比较大,所以通用写法的效率肯定比特定类型的写法低,所以需要根据实际情况来权衡使用,如下截图为 int 类型的基准测试:

format,png原文作者: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值