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

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

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

Go
慕运维8079593 2021-09-10 15:24:25
我正在尝试编写一个函数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为数组类型。请建议,我如何使用我的函数来处理通用数组。
查看完整描述

2 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

正如 Rob Pike 在此线程中提到的

是否可以在 Go 类型开关中表达“任何映射”、“任何数组”或“任何切片”?

否 。静态类型必须是精确的
空接口实际上是一种类型,而不是通配符。

您只能迭代特定类型的列表,例如具有已知功能的接口。
您可以看到一个示例,其中包含“我们可以在 go 中编写通用数组/切片重复数据删除吗? ”

即使使用反射,interface{}本线程所示,传递切片也容易出错(请参阅此示例)。


查看完整回答
反对 回复 2021-09-10
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

您对 Map 的定义有些不完整。声明它的通常方法是使用 mapper 方法。您的示例至少可以通过这种方式实现


package main


import "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 意义上的“泛型”


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

添加回答

举报

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