大家好,加个箭我是语法煎鱼。 在六一儿童节前夕在摸煎鱼时,下更像看到一个很神奇的加个箭 Go2 的技术提案,想要加一个更简单、语法更轻量的下更像匿名函数语法。 今天就由煎鱼和大家一起看看。加个箭 新的语法 Go 提案目的是添加轻量级的匿名函数语法,业内别名又叫 “箭头语法”,下更像是加个箭由 @Damien Neil 所提出的,提案的语法来源是《proposal: Go 2: Lightweight anonymous function syntax[1]》,褒贬都有: 我们由此进行展开。下更像 如下例子: import ( "fmt" "math" ) func compute(fn func(float64,加个箭 float64) float64) float64 { return fn(3, 4) } func main() { hypot := func(x, y float64) float64 { return math.Sqrt(x*x + y*y) } fmt.Println(hypot(5, 12)) fmt.Println(compute(hypot)) fmt.Println(compute(math.Pow)) 上述代码主要是实现了多个匿名的闭包函数,实际上业务逻辑没有什么。语法认为由于闭包签名繁杂,下更像导致代码可读性不高。 为了避免这种情况,许多语言允许省略匿名函数的参数和返回类型,因为它们可能是服务器租用从上下文派生的,能够直接被复用。 如下 Scala 的例子: compute((x: Double, y: Double) => x + y) compute((x, y) => x + y) // Parameter types elided. Rust 的例子: compute(|x: f64, y: f64| -> f64 { x + y }) 因此这个 Go 提案就是希望针对匿名闭包增加这个轻量级的语法,让代码看起来更加的简洁,让代码可读性提高。 PHP 的例子: $x = 1; $fn = fn() => $x++; // 不会影响 x 的值 $fn(); 更有那味了。 Go 开源库 Capn Proto(capnproto/go-capnproto2[2])是一种极其快速的数据交换格式,类似于Protocol Buffers,但速度快得多。 以下是其代码使用片段: s.Write(ctx, func(p hashes.Hash_write_Params) error { err := p.SetData([]byte("Hello, ")) return err 假设我们是 Rust,效果如下:: s.Write(ctx, |p| { err := p.SetData([]byte("Hello, ")) return err 这个 errgroup 库相信大家不会陌生,常用于多个 goroutine 的异步场景中的 err 处理和同步。 以下是其使用片段: g.Go(func() error { // perform work return nil 假设我们是 Scala,效果如下: g.Go(() => { // perform work return nil }) 只从代码数量来对比看,确实是简洁一些。云服务器 这个提案引起了社区不小的轰动和讨论,有多种不同的观点。 先从 Go 的语法角度来看。语法格式为: 例子会变成: s.Write(ctx, p => p.SetData([]byte("Hello, ")) 更更更短了。 许多小伙伴认为这反而降低了代码可读性,更难懂了,还得在脑子里转换几道,才能知道是什么意思... 你想想,随便在公司上抓一只煎鱼。假设他没有提前了解过这个语法,他能读得懂这段代码是什么意思吗? 如下: 显然,他没法 100% 确定。但没有这语法时,只是正常的匿名闭包,是可以读懂的。因为语法基本是通识,而箭头语法并不是。 在 Go 早期的设计,其实对 “箭头语法”,也就是本提案进行过研究。亿华云计算 当时的语法是: 因为它不能很好地处理多个(非元组)返回值;一旦出现 func 和参数,箭头就多余了,会变得很复杂。 虽然这么做会看起来更 “漂亮”,但 “漂亮”(就像在数学上看起来一样)可能仍然是多余的。它看起来也像是属于一种“不同”语言的语法。 官方也认为必须非常小心,不要为闭包创建特殊语法。因为现在 Go 所拥有的是简单而规律的语法和逻辑。 最终放弃了添加箭头语法的想法。 从代码示例来看,引起繁杂的主要是类型声明和结构。因此也有人提出使用省略符来实现类似效果。 如下代码: 这样的好处是不需要语法改变。 原提案作者的本意,可能是需要让匿名闭包更加的简洁,降低代码复杂度。但其实这本质上,节约的只是明面上的复杂度。 一旦引入这类 “箭头” 语法,可能会更大的加剧脑子转换的开销。看代码时,得想想对对,会加重底下的脑力开销。 当然,说不定我也是错的。你觉得呢?是否支持 Go 新增轻量级的匿名闭包语法,也就是业内俗称的 “箭头” 语法。 [1]proposal: Go 2: Lightweight anonymous function syntax: https://github.com/golang/go/issues/21498 [2]capnproto/go-capnproto2: https://github.com/capnproto/go-capnproto2真实案例
Capn Proto总结