猿问

如何在golang中为泛型参数编写func

我正在尝试编写一个函数Map,以便它可以处理所有类型的数组。


// Interface to specify generic type of array.

type Iterable interface {

}


func main() {

    list_1 := []int{1, 2, 3, 4}

    list_2 := []uint8{'a', 'b', 'c', 'd'}

    Map(list_1)

    Map(list_2)

}


// This function prints the every element for

// all []types of array.

func Map(list Iterable) {

    for _, value := range list {

        fmt.Print(value)

    }

}

但它会引发编译时错误。


19: cannot range over list (type Iterable)

错误是正确的,因为range需要数组、指向数组的指针、切片、字符串、映射或通道允许接收操作,这里的类型是Iterable。我认为我面临的问题是将参数类型转换Iterable为数组类型。请建议,我如何使用我的函数来处理通用数组。


慕运维8079593
浏览 186回答 2
2回答

开满天机

正如 Rob Pike 在此线程中提到的是否可以在 Go 类型开关中表达“任何映射”、“任何数组”或“任何切片”?否 。静态类型必须是精确的。空接口实际上是一种类型,而不是通配符。您只能迭代特定类型的列表,例如具有已知功能的接口。您可以看到一个示例,其中包含“我们可以在 go 中编写通用数组/切片重复数据删除吗? ”即使使用反射,interface{}如本线程所示,传递切片也容易出错(请参阅此示例)。

慕工程0101907

您对 Map 的定义有些不完整。声明它的通常方法是使用 mapper 方法。您的示例至少可以通过这种方式实现package mainimport "fmt"// Interface to specify something thet can be mapped.type Mapable interface {}func main() {    list_1 := []int{1, 2, 3, 4}    list_2 := []string{"a", "b", "c", "d"}    Map(print, list_1)    Map(print, list_2)}func print(value Mapable){fmt.Print(value)}// This function maps the every element for// all []types of array.func Map(mapper func(Mapable), list ... Mapable) {    for _, value := range list {        mapper(value)    }}它有效。需要说它有点无类型。因为不,Go 没有 Hindley-Milner 意义上的“泛型”
随时随地看视频慕课网APP

相关分类

Go
我要回答