将字符串切片尝试索引方法提取到所有切片类型

时间:2013-12-27 16:30:24

标签: go slice

我有这个函数用于切片:

func tryIndex(arr []string, index int, def string) string {
    if index <= len(arr)-1 {
        return arr[index]
    }
    return def
}

我想将它抽象为一般的切片类型方法。

func (i []interface) TryIndex(index int, def interface) interface {
    if (index <= len(i)-1) {
        return i[index]
    }
    return def
}

然而,这给了我两个错误:

prog.go:9: syntax error: unexpected ), expecting {
prog.go:13: non-declaration statement outside function body

第9行是基金申报行,第13行是“返回默认”行。

发生了什么,我该如何解决?谢谢!

编辑:我的原始问题的一个问题是,显然默认是不允许的。我将其改为“def”。

编辑:使用@ WesFreeman的建议并解决了一些问题......现在我明白了:

prog.go:16: invalid receiver type []interface {} ([]interface {} is an unnamed type)
prog.go:27: aArr.TryIndex undefined (type []string has no field or method TryIndex)
prog.go:28: bArr.TryIndex undefined (type []string has no field or method TryIndex)

调用者函数看起来大致如下:

aArr := []string{"al", "ba", "ca"} // Arbitrary variable
bArr := []string{"tl", "cl", "rl"} // same
for i := range aArr {
    aR := aArr.TryIndex(i, "00")
    bR := bArr.TryIndex(i, "00")
}

最终编辑:

完全没有我必须从字符串开始的东西。我的问题主要围绕是否有可能将其抽象为所有切片类型。如果不是那也是一个完全有效的答案!

1 个答案:

答案 0 :(得分:0)

您的直接问题是空接口为interface{},而不仅仅是interface。所以它期待不存在的花括号。

如果您要接受所有类型的切片,则需要将i声明为interface{},而不是[]interface{},因为无法将[]string分配给[]interface{}一个interface{},但可以将任何内容分配给TryIndex。然后,您将需要使用反射包来访问元素。

但是,您的泛型函数的用途有限,因为它的返回值需要对切片的元素类型进行类型断言。 {{1}}基本上是语法糖,但类型断言会让它变得非常甜蜜。