当前位置: 首页 > 面试题库 >

有没有一种方法可以编写通用代码来确定切片中是否包含Go中的特定元素?

何哲
2023-03-14
问题内容

我想知道是否存在一种通用的方法来编写代码来判断切片是否包含元素,我发现它会经常有用,因为有很多逻辑可以判断切片中是否已存在特定的elem,然后决定要处理的内容。接下来。但是似乎没有内置的方法(为了上帝,为什么?)

我尝试使用interface{}这样做:

func sliceContains(slice []interface{}, elem interface{}) bool {
    for _, item := range slice {
       if item == elem {
          return true
       }
    }
    return false
}

我以为interface{}有点像ObjectJava,但显然我错了。我每次遇到新的切片时都应该写这个吗?没有通用的方法可以做到这一点吗?


问题答案:

您可以使用进行此操作reflect,但它比非泛型等效函数要 得多:

func Contains(slice, elem interface{}) bool {

    sv := reflect.ValueOf(slice)

    // Check that slice is actually a slice/array. 
    // you might want to return an error here
    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


}

func main(){
    si := []int {3, 4, 5, 10, 11}
    ss := []string {"hello", "world", "foo", "bar"}

    fmt.Println(Contains(si, 3))
    fmt.Println(Contains(si, 100))
    fmt.Println(Contains(ss, "hello"))
    fmt.Println(Contains(ss, "baz"))

}

慢多少? 大约慢x50-x60 :对以下形式的非泛型函数进行基准测试:

func ContainsNonGeneic(slice []int, elem int) bool {
    for _, i := range slice {
        if i == elem {
            return true
        }
    }
    return false
}

我越来越:

  • 通用: N=100000, running time: 73.023214ms 730.23214 ns/op
  • 非通用: N=100000, running time: 1.315262ms 13.15262 ns/op


 类似资料:
  • 问题内容: 我知道你可以打电话 如果它不是可执行文件,则会得到一个异常,但这是不安全的,因为运行可执行文件会产生副作用。 我想只检查扩展名在Windows上就足够了,但是有没有办法我可以读取* nix文件系统上的可执行文件呢? 找出文件在OS中是否可执行的最佳方法是什么? 问题答案: 参见java.io.File.canExecute()

  • 我们可以使用这些jvm标志来确定编译阈值,但是有没有一种方法可以在运行时以编程方式确定它?

  • 问题内容: 现在我正在做: 有没有更有效的方法直接从Find(或其他搜索功能)中获取带有用户名的slice,而没有struct和range循环? 问题答案: MongoDB的结果始终是文档列表。因此,如果要获取值列表,则必须像以前一样手动将其转换。 使用自定义类型(源自) 另外请注意,如果您要创建自己的类型(从派生),则可以覆盖其取消编组逻辑,并仅从文档中“提取” 。 它看起来像这样: 然后将用户

  • 问题内容: PMD可以忽略Java源文件中带有注释的特定警告。 Checkstyle有类似的选择吗? 问题答案: 是的,请查看SuppressionCommentFilter和SuppressWithNearbyCommentFilter选项。

  • 据我所知,这个问题实际上只有在使用Chrome浏览器执行web测试自动化时才相关,因为click事件是用Selenium Webdriver和ChromeDriver实现的。为了引言,我使用并意识到通过使用Watir元素函数“present?”来找到一个元素,根据我的理解,它本质上是“visible?”的组合。和“存在?”。我还可以在需要时找到一个具有Webdriver元素函数的元素,以识别一个元

  • 在空手道中,我希望有一个模式变量,它是响应数据的超集,这样我就可以用相同的模式测试多个请求。 这对于GraphQL应该特别有用,因为请求本身定义了返回的字段。 预期模式: 回答数据: 在本例中,响应返回的所有键。数据应该在架构中,但架构中的任何键都不在响应中。数据应该被忽略。 在空手道中有没有办法做到这一点,或者有没有计划在将来增加这一功能? 编辑:更新了示例,因为唯一遗漏的属性是一个可为空的属性