对于字符串片段,我有这个函数:
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行是"return default“行。
这是怎么回事,我怎么才能修复它?谢谢!
编辑:我最初问题的一个问题是,显然默认是不允许的。我把它改成了"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")
}最终编辑:
对于我刚开始的字符串来说,这完全没问题。我的问题主要围绕着是否有可能将其抽象为所有切片类型。如果不是,这也是一个完全有效的答案!
发布于 2013-12-28 01:24:50
直接的问题是空接口是interface{},而不仅仅是interface。所以它期望的是没有花括号的。
如果您希望接受所有类型的切片,则需要将i声明为interface{},而不是[]interface{},因为[]string不能被分配给[]interface{},但是任何东西都可以被分配给interface{}。然后,您将需要使用反射包来访问这些元素。
不过,您的泛型函数的用途有限,因为它的返回值需要对切片的元素类型进行类型断言。TryIndex基本上是语法糖,但是类型断言会让它变得不那么甜蜜。
https://stackoverflow.com/questions/20804142
复制相似问题