我有一个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 一样,它们是很好的函数式/声明式助手
在这里,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的建议.用于循环.
Cle*_*ent 10
如果您仍然感兴趣,该go-funk软件包将使您能够执行 map/reduce/filter 等操作。
本库在回答时定期更新。前面提到的库已经 4 年没有更新了。
我不同意 peterSO 的报价。如果你想用golang来实现像presto/Athena/hive/impala/sparkSQL这样的查询引擎,你需要创建一个map/reduce/filter抽象层。没有它,从 select/where 那种 SQL 查询中进行术语重写并不是那么简单。
当然,我们没有看到 Golang 实现了查询引擎还有更深层次的原因:)
在 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)