gpt4 book ai didi

go - 有没有一种方法可以编写通用代码来查明 slice 是否包含 Go 中的特定元素?

转载 作者:IT王子 更新时间:2023-10-29 00:54:14 26 4
gpt4 key购买 nike

我想知道是否有一种通用的方法来编写代码来判断一个 slice 是否包含一个元素,我发现它经常有用,因为有很多逻辑可以先判断特定的元素是否已经在一个 slice 中,然后决定下一步做什么。但是似乎没有内置的方法(看在上帝的份上,为什么?)

我尝试使用 interface{} 来做到这一点:

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

我认为 interface{} 有点像 Java 的 Object,但显然,我错了。我是否应该在每次遇到新的 slice 结构时都写这个?没有通用的方法来执行此操作吗?

最佳答案

您可以使用 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,运行时间:73.023214ms 730.23214 ns/op
  • 非通用:N=100000,运行时间:1.315262ms 13.15262 ns/op

关于go - 有没有一种方法可以编写通用代码来查明 slice 是否包含 Go 中的特定元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28828440/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com