我有这个函数用于切片:
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")
}
最终编辑:
完全没有我必须从字符串开始的东西。我的问题主要围绕是否有可能将其抽象为所有切片类型。如果不是那也是一个完全有效的答案!
答案 0 :(得分:0)
您的直接问题是空接口为interface{}
,而不仅仅是interface
。所以它期待不存在的花括号。
如果您要接受所有类型的切片,则需要将i
声明为interface{}
,而不是[]interface{}
,因为无法将[]string
分配给[]interface{}
一个interface{}
,但可以将任何内容分配给TryIndex
。然后,您将需要使用反射包来访问元素。
但是,您的泛型函数的用途有限,因为它的返回值需要对切片的元素类型进行类型断言。 {{1}}基本上是语法糖,但类型断言会让它变得非常甜蜜。