为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
犯罪嫌疑人X 2021-11-08 18:55:07
我的代码:package sort_testtype SortList []interface{}type SortFunc func(interface{}, interface{}) boolfunc Do(list SortList, function SortFunc)主包package mainimport (        "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.Dosrc/algorithm/algorithm.go:32: cannot use function (type func(int, int) bool) as type sort_test.SortFunc in argument to sort_test.Domake: *** [algorithm] Error 2
查看完整描述

2 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

不能。接口就是接口。


interface{} 不是某种“任何”类型。但是,任何类型都实现了 interface{}。接口只是一组应该实现的方法。


如果要检查 interface{} 是否是切片,可以这样写:


import "reflect"


t := reflect.TypeOf(list)

if t.Kind() == reflect.Slice {

    ...

}

我建议您阅读这篇非常有用的文章:http : //blog.golang.org/laws-of-reflection。


此外,阅读 sort 包的代码会很好: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{} 并不是一个空接口。它是一个切片类型,其元素为 interface{}; []int 不是 []interface{},只是实现了 interface{}。


我猜您想编写某种通用的排序方法,就像您在 Java 中使用泛型编写它一样。我认为这是一个糟糕的代码。


查看完整回答
反对 回复 2021-11-08
?
Helenr

TA贡献1780条经验 获得超3个赞

错误告诉您,您正在尝试将一个 int 数组(slice变量)传递给 function Do,该函数期望它的第一个参数为 type SortList

此外,您的接口定义看起来不正确。你有数组语法。它应该是这样的:

type SortList interface{}

我建议您查看有关接口的gobyexample页面。


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 260 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信