首页 > 后端开发 > Golang > 正文

如何检查 Go 中不同类型切片中是否存在元素?

Linda Hamilton
发布: 2024-11-02 03:11:30
原创
274 人浏览过

How do you check for element presence in slices of different types in Go?

如何在 Go 中一般检查切片中是否存在元素

在 Go 中,确定切片是否包含特定元素可以是常见场景。但是,没有内置方法可以跨不同切片类型执行此通用检查。

接口尝试失败{}

尝试使用接口{ } type 作为通用解决方案,如下所示,似乎是合理的:

<code class="go">func sliceContains(slice []interface{}, elem interface{}) bool {
    for _, item := range slice {
       if item == elem {
          return true
       }
    }
    return false
}</code>
登录后复制

但是,比较不同类型(interface{})的值可能会导致不正确的结果。

使用反射的通用解决方案

要实现真正通用的解决方案,可以采用反射。以下函数使用反射来迭代切片并将每个元素与目标元素进行比较:

<code class="go">func Contains(slice, elem interface{}) bool {

    sv := reflect.ValueOf(slice)

    // Check that slice is actually a slice/array.
    if sv.Kind() != reflect.Slice && sv.Kind() != reflect.Array {
        return false
    }

    // Iterate the slice
    for i := 0; i < sv.Len(); i++ {

        // Compare elem to the current slice element
        if elem == sv.Index(i).Interface() {
            return true
        }
    }

    // Nothing found
    return false
}</code>
登录后复制

此解决方案允许您对任何类型的切片执行通用元素检查。

性能注意事项

虽然通用 Contains 函数提供了所需的功能,但它会带来显着的性能成本。针对非通用等效函数进行基准测试会产生大约 50 倍的减速因子。因此,在使用反射进行通用元素检查之前评估性能影响至关重要。

以上是如何检查 Go 中不同类型切片中是否存在元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!