地图/缩小/过滤/等的惯用替换

Ala*_*orm 11 go

我有一个go程序列表.我想循环遍历它们,并对这些事物的子集执行某些操作.是否有比以下更优雅/惯用的代码?

for key, value := range listOfThings {
    if(!value.Enabled) {
        continue;
    }

    doTheThing(key, value)
}
Run Code Online (Sandbox Code Playgroud)

大型语境 - 我来自语言,其中map/reduce/filter /等是这类事物的流行模式,但互联网上的一句话是,那些更高级别的抽象并不是真正的好事.去做.

continue对于这种代码,我的范围块中是否有比保护/ 子句更优雅的东西?

Val*_*ani 18

2022 年 3 月更新:
您可能对实现泛型的包感兴趣lo,该包于 2022 年 3 月 15 日在稳定版 Go (1.18) 中发布。就像 Javascript 的 Lodash 一样,它们是很好的函数式/声明式助手

https://github.com/samber/lo

在这里,str自动推断是string因为泛型,非常酷且强大

str, ok := lo.Find([]string{"foobar"}, func(i string) bool {
    return i == "b"
})
Run Code Online (Sandbox Code Playgroud)


pet*_*rSO 15

简单的应用/过滤/减少包.

我想看看在Go中实现这种东西是多么困难,因为我能管理的API很好.这并不难.

几年前写完之后,我没有机会使用它一次.相反,我只是使用"for"循环.

你也不应该使用它.

罗伯派克


按照Rob的建议.用于循环.

  • 这是非常固执己见和粗鲁的。'我只是使用“for”循环。你也不应该使用它。好像他是编程之神什么的...也许他应该向 Rich Hickey 和 Clj 社区学习基本原理的含义... (25认同)
  • 我不同意,for循环是初级水平,而使用集合方法是高级水平。遗憾的是,Go 仍然没有开箱即用的 map/filter/reduce/any/take/skip 等方法。 (11认同)
  • 如果罗布能用“因为……”来详细阐述他的建议,那就太好了 (3认同)
  • 为什么标记为答案?这是一个非常固执己见的声明。显然,函数式方法有其明显的优势,否则它不会像今天这样流行,而且 Golang 缺少当今大多数语言被认为是基本的功能这一事实并不意味着你“不应该使用“ 那些。 (3认同)
  • 现代语言,例如 go,没有配备支持“map”的数组库,这有点奇怪。我想知道这是否有原因。因为这意味着,我们该如何处理关闭呢? (3认同)

Cle*_*ent 10

如果您仍然感兴趣,该go-funk软件包将使您能够执行 map/reduce/filter 等操作。

本库在回答时定期更新。前面提到的库已经 4 年没有更新了。

Github - 去放克

  • 好点@Magnus,但版本应该锁定在您的设置中,以确保不会发生这种情况。 (3认同)

cpc*_*ung 6

我不同意 peterSO 的报价。如果你想用golang来实现像presto/Athena/hive/impala/sparkSQL这样的查询引擎,你需要创建一个map/reduce/filter抽象层。没有它,从 select/where 那种 SQL 查询中进行术语重写并不是那么简单。

当然,我们没有看到 Golang 实现了查询引擎还有更深层次的原因:)


Mar*_*rio 5

在 Go 1.18 中,类型参数(泛型)支持类型安全的函数结构,并且一些库(例如gostream)正在利用它。例如:

results := stream.Generate(rand.Int).
    Map(func(n int) int {
        return n%6 + 1
    }).
    Limit(5).
    ToSlice()

fmt.Printf("results: %v\n", results)
Run Code Online (Sandbox Code Playgroud)

输出:

results: [3 5 2 1 3]
Run Code Online (Sandbox Code Playgroud)