来自Nodejs,我可以做如下事情:

// given an array `list` of objects with a field `fruit`:

fruits = list.map(el => el.fruit) # which will return an array of fruit strings 

有没有办法在golang用优雅的单尾班轮做到这一点?

我知道我可以用一个量程环路来实现,但我正在寻找一个线性解决方案的可能性

推荐答案

在Go中,数组是不灵活的(因为它们的长度是用它们的类型编码的),传递给函数的代价很高(因为函数在数组参数的副本上操作).我假设你想在slices而不是数组上操作.

因为methods cannot take additional type arguments,你不能简单地在围棋中声明一个通用的Map method.但是,您可以将Map定义为通用top-level function:

func Map[T, U any](ts []T, f func(T) U) []U {
    us := make([]U, len(ts))
    for i := range ts {
        us[i] = f(ts[i])
    }
    return us
}

然后你可以写下面的代码,

names := []string{"Alice", "Bob", "Carol"}
fmt.Println(Map(names, utf8.RuneCountInString))

打印[5 3 5]到stdout(在this Playground中试用).


Go 1.18增加了a golang.org/x/exp/slices package,这为切片提供了许多方便的操作,但明显缺少Map功能.该功能的省略是GitHub issue中专门讨论golang.org/x/exp/slices提案的长时间讨论的结果;关注的问题包括:

Russ Cox ultimately Select 从提案中删除Map,因为它是

作为其他地方更全面的streams API的一部分可能更好.

Go相关问答推荐

Go汇编器命名为Constants

golang.org/x/oauth2 oauth2.Config.Endpoint.TokenURL mock:缺少access_token

Go源在Goland(IDEA)中以灰色显示.什么意思?我怎么才能让它恢复正常?

Docker Compose Health Check未退出,错误为无法启动

在nixos上找不到XInput2.h头文件的包

从带有嵌套括号的字符串中提取值

Go Gin:验证 base64

这种合并排序的实现有什么问题?

正则表达式模式,确保至少一个字符与其他条件一起存在

Go Build删除信息

我应该先解锁然后再广播吗?

在 Go 中解组编号的 XML 标签

Gorm 在自定义字符串类型上返回 scanner 错误

regex.ReplaceAll 但如果替换则添加相同数量的字符

Wire google Inject with multi return from provider 函数

如何修改go gin的默认端口?我的 8080 端口正在使用中

没有堆栈跟踪的 go 程序崩溃是什么意思?

如何使路径/不匹配 Golang net/http 中所有其他不匹配的路径

(如何)我可以基于接口抽象地实现Stringer吗?

try 创建新的 etcdv3 客户端时出现pc error: code = Unavailable desc = error reading from server: EOF