是golang [] interface {}不能是函数参数吗?

时间:2015-09-27 11:24:35

标签: algorithm go interface

我的代码:

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

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页面。