douyang2530 2016-07-22 11:57
浏览 86
已采纳

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

Let's say I want to write a function that finds a value in a slice

I intuitively want to write:

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

however I don't manage to do this with Go. I could have an interface with

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

and this would work but in my real code things are more complicated (I need to do slices[from:end] etc), append, ... etc and if I redefine all this in an interface I end up having a lot of code. Is there a better way?

  • 写回答

3条回答 默认 最新

  • doujiang5211 2016-07-22 12:16
    关注

    You can use reflection. I wrote this function for a project, feel free to use it:

    // 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
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)