Is golang []interface{} cannot be function parameter?
本问题已经有最佳答案,请猛点这里访问。
我的代码:
1 2 3 4 5 6 7 8 | package sort_test type SortList []interface{} type SortFunc func(interface{}, interface{}) bool func Do(list SortList, function SortFunc) |
主包装
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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) } |
号编译错误
1 2 3 | 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 |
不能。接口就是接口。
接口不是某种"任何"类型。但是,任何类型都实现接口。接口只是一组应该实现的方法。
如果要检查接口是否为切片,可以这样编写:
1 2 3 4 5 6 | import"reflect" t := reflect.TypeOf(list) if t.Kind() == reflect.Slice { ... } |
号
我建议你阅读这篇非常有用的文章:http://blog.golang.org/laws-of-reflection。
此外,还可以阅读排序包的代码:https://golang.org/pkg/sort/。这是golang方式实现排序的一个例子。
编辑:如果您真的想使用[]接口作为参数,实际上可以这样做:
1 2 3 4 5 | vs := make([]interface{}, len(list)) for i, e := range list { vs[i] = e } Do(vs, f) |
实际上,[]接口不是空接口。它是一个切片类型,其元素为interface[]int不是[]interface,而是实现interface。
我想你想编写一种通用的排序方法,就像用Java中的泛型来编写它一样。我认为这是一个错误的代码。
错误告诉您,您正试图将一个int数组(
而且,您的接口定义看起来不正确。这里有数组语法。应该是这样的:
1 | type SortList interface{} |
我建议您查看接口上的GobyExample页面。