我的代码:
package sort_test
type SortList []interface{}
type SortFunc func(interface{}, interface{}) bool
func Do(list SortList, function SortFunc)
主要包
package main
import (
"sort_test"
)
func main() {
list := []int{3, 4, 5, 6, 6, 77, 4, 4, 5, 6, 8, 345, 45, 424, 2, 67, 7, 830}
slice := list[:]
sort_test.Do(slice, function)
}
src/algorithm/algorithm.go:32: cannot use slice (type []int) as type sort_test.SortList in argument to sort_test.Do
src/algorithm/algorithm.go:32: cannot use function (type func(int, int) bool) as type sort_test.SortFunc in argument to sort_test.Do
make: *** [algorithm] Error 2
答案 0 :(得分:3)
不能。接口是接口。
interface {}不是某种“任何”类型。 但是,任何类型都实现了接口{}。接口只是一组应该实现的方法。
如果要检查接口{}是否为切片,可以这样写:
import "reflect"
t := reflect.TypeOf(list)
if t.Kind() == reflect.Slice {
...
}
我建议您阅读这篇非常有用的文章:http://blog.golang.org/laws-of-reflection。
此外,阅读排序包的代码会很高兴:https://golang.org/pkg/sort/。这是golang-way排序实现的一个例子。
编辑:如果你真的想使用[] interface {}作为参数,实际上你可以这样做:
vs := make([]interface{}, len(list))
for i, e := range list {
vs[i] = e
}
Do(vs, f)
实际上,[] interface {}不是空接口。它是一个切片类型,其元素是接口{}; [] int不是[] interface {},但只是实现了接口{}。
我想你想要写一些通用的排序方法,就像你在Java中使用泛型来编写它一样。我认为这是一个糟糕的代码。
答案 1 :(得分:0)
错误告诉您正在尝试将一个int数组(slice
变量)传递给函数Do
,该函数期望它的第一个参数为{{1} }}
此外,您的界面定义看起来不正确。你有数组语法。它应该是这样的:
SortList
我建议您查看界面上的gobyexample页面。