关于算法:golang [] interface {}不能是函数参数吗?

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数组(slice变量)传递给函数Do,该函数期望它是作为SortList类型的第一个参数。

而且,您的接口定义看起来不正确。这里有数组语法。应该是这样的:

1
type SortList interface{}

我建议您查看接口上的GobyExample页面。