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

在Go中,如何使用切片创建通用函数?

亢雅懿
2023-03-14
问题内容

假设我要编写一个在切片中查找值的函数

我直观地想写:

func find(s []interface{}, f func(interface{})bool) int {
    for i, item := range s {
        if f(item) {
            return i
        }
    }
    return -1
}

但是我无法通过Go做到这一点。我可以与

Len() int
Value(int) interface{}
...

这样就可以了,但是在我的真实代码中,事情变得更加复杂(我需要进行slices
[from:end]等),append等…,如果我在接口中重新定义了所有这些代码,我最终会拥有很多代码。有没有更好的办法?


问题答案:

您可以使用反射。我为项目编写了此函数,请随时使用它:

// InSlice returns true if value is in slice
func InSlice(value, slice interface{}) bool {
    switch reflect.TypeOf(slice).Kind() {
    case reflect.Slice, reflect.Ptr:
        values := reflect.Indirect(reflect.ValueOf(slice))
        if values.Len() == 0 {
            return false
        }

        val := reflect.Indirect(reflect.ValueOf(value))

        if val.Kind() != values.Index(0).Kind() {
            return false
        }

        for i := 0; i < values.Len(); i++ {
            if reflect.DeepEqual(values.Index(i).Interface(), val.Interface()) {
                return true
            }
        }
    }
    return false
}


 类似资料:
  • 问题内容: 在Go中清除切片的适当方法是什么? 这是我在go论坛中找到的内容: 这样对吗? 为了澄清起见,清除了缓冲区,以便可以重用它。 一个示例是bytes包中的Buffer.Truncate函数。 请注意,Reset只是调用Truncate(0)。因此看来,在这种情况下,第70行将评估:b.buf = b.buf [0:0] http://golang.org/src/pkg/bytes/bu

  • 创建大小为的隐式数组,并创建一个隐式数组的浅副本,指向数组中的前7个元素。 考虑 创建不指向任何隐式数组的零长度切片。 创建长度为2的新隐式数组,并附加值和。slice()指向新的隐式数组,其中

  • 问题内容: 尝试使用Go的http包时,我无法确定的语法。尽管我尝试了其他一些被编译器拒绝的其他事情,但这里只有我标记的以下内容是我必须编译的。 该URL可以,因为可以正常使用,但是在我运行时,它只是一个空字符串,并且始终为零。我需要怎么做才能取出数据?编译器拒绝了其他尝试。 输出看起来像这样: 问题答案: 尝试给切片buf设置一个大小,例如 读取器最多读取给定缓冲区的len()。 来自io.go

  • 问题内容: 我正在使用Vector类型存储字节数组(可变大小) 一切正常,但是当我尝试检索值时,编译器告诉我我需要使用类型断言。所以我添加了这些,然后尝试 但是当我运行它时,它会失败: 是否知道如何从Vector用于存储其数据的空Element接口中“投射” /转换为实际的[] byte数组,然后供以后使用? 更新(Go1): 矢量软件包已于2011-10-18删除。 问题答案: 这对我来说很好。

  • 问题内容: 由于Java泛型的实现,因此不能有以下代码: 如何在保持类型安全的同时实现此目的? 我在Java论坛上看到了这样的解决方案: 但是我真的不知道发生了什么。 问题答案: 我不得不问一个问题:您的GenSet“已选中”还是“未选中”?那是什么意思? 检查:强打字。GenSet明确地知道什么类型的包含对象(即它的构造是明确要求有Class 参数,当他们通过了类型不是参数的方法会抛出异常E。见

  • 问题内容: 我正在寻找一种有效的方法来检查切片是否是另一个切片的子集。我可以简单地遍历它们进行检查,但是我觉得必须有更好的方法。 例如 {1,2,3}是{1,2,3,4} 的子集{1,2,2}不是{1,2,3,4}的子集 有效执行此操作的最佳方法是什么? 谢谢! 问题答案: 我认为解决子集问题的最常见方法是通过地图。 检查重复值的能力相对罕见。上面的代码按要求解决了问题(请参阅:http : //