当前位置:网站首页>Go 要加个箭头语法,这下更像 PHP 了!
Go 要加个箭头语法,这下更像 PHP 了!
2022-06-13 10:42:00 【脑子进煎鱼了】
大家好,我是煎鱼。
在六一儿童节前夕在摸煎鱼时,看到一个很神奇的 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.
compute(_ + _) // Or even shorter.
Rust 的例子:
compute(|x: f64, y: f64| -> f64 { x + y })
compute(|x, y| { x + y }) // Parameter and return types elided.
因此这个 Go 提案就是希望针对匿名闭包增加这个轻量级的语法,让代码看起来更加的简洁,让代码可读性提高。
PHP 的例子:
$x = 1;
$fn = fn() => $x++; // 不会影响 x 的值
$fn();
var_export($x); // 输出 1
更有那味了。
真实案例
Cap'n Proto
Go 开源库 Cap'n 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
这个 errgroup 库相信大家不会陌生,常用于多个 goroutine 的异步场景中的 err 处理和同步。
以下是其使用片段:
g.Go(func() error {
// perform work
return nil
})
假设我们是 Scala,效果如下:
g.Go(() => {
// perform work
return nil
})
只从代码数量来对比看,确实是简洁一些。
讨论
这个提案引起了社区不小的轰动和讨论,有多种不同的观点。
语法格式
先从 Go 的语法角度来看。语法格式为:
[ Identifier ] | "(" IdentifierList ")" "=>" ExpressionList
例子会变成:
s.Write(ctx, p => p.SetData([]byte("Hello, "))
g.Go(=> nil)
更更更短了。
降低了可读性
许多小伙伴认为这反而降低了代码可读性,更难懂了,还得在脑子里转换几道,才能知道是什么意思...
你想想,随便在公司上抓一只煎鱼。假设他没有提前了解过这个语法,他能读得懂这段代码是什么意思吗?
如下:
g.Go(=> nil)
显然,他没法 100% 确定。但没有这语法时,只是正常的匿名闭包,是可以读懂的。因为语法基本是通识,而箭头语法并不是。
早期设计被拒绝
在 Go 早期的设计,其实对 “箭头语法”,也就是本提案进行过研究。
当时的语法是:
func f (x int) -> float32
因为它不能很好地处理多个(非元组)返回值;一旦出现 func 和参数,箭头就多余了,会变得很复杂。
虽然这么做会看起来更 “漂亮”,但 “漂亮”(就像在数学上看起来一样)可能仍然是多余的。它看起来也像是属于一种“不同”语言的语法。
官方也认为必须非常小心,不要为闭包创建特殊语法。因为现在 Go 所拥有的是简单而规律的语法和逻辑。
最终放弃了添加箭头语法的想法。
用省略符替代
从代码示例来看,引起繁杂的主要是类型声明和结构。因此也有人提出使用省略符来实现类似效果。
如下代码:
s.Write(ctx, func(p _) _ { return p.SetData([]byte("Hello, ")) })
这样的好处是不需要语法改变。
总结
原提案作者的本意,可能是需要让匿名闭包更加的简洁,降低代码复杂度。但其实这本质上,节约的只是明面上的复杂度。
一旦引入这类 “箭头” 语法,可能会更大的加剧脑子转换的开销。看代码时,得想想对对,会加重底下的脑力开销。
当然,说不定我也是错的。你觉得呢?是否支持 Go 新增轻量级的匿名闭包语法,也就是业内俗称的 “箭头” 语法。
欢迎大家在评论区留言和交流。
参考资料
proposal: Go 2: Lightweight anonymous function syntax: https://github.com/golang/go/issues/21498
[2]capnproto/go-capnproto2: https://github.com/capnproto/go-capnproto2
关注和加煎鱼微信,
获取业内消息和知识,拉你进交流群

你好,我是煎鱼,出版过 Go 畅销书《Go 语言编程之旅》,再到获得 GOP(Go 领域最有观点专家)荣誉,点击蓝字查看我的出书之路。
日常分享高质量文章,输出 Go 面试、工作经验、架构设计,加微信拉读者交流群,和大家交流!
边栏推荐
- d编译时生成唯一标识
- Questions and answers of the labor worker general basic (labor worker) work license in 2022
- The first laravel workflow engine released the official version of v1.0
- Index query list injects MySQL and executes Oracle
- vivo大规模 Kubernetes 集群自动化运维实践
- 【ELM分类】基于粒子群优化卷积神经网络CNN结合极限学习机ELM实现数据分类附matlab代码
- 终于,月入 20000 !!
- 电赛校赛经验-程控风力摆
- Simple query cost estimation [Gauss is not a mathematician this time]
- Vivo large scale kubernetes cluster automation operation and maintenance practice
猜你喜欢

spark源码(一)spark-submit如何将jar以及配置参数提交给spark服务器

宝塔中navicat连接mysql

【轴承故障分解】基于matlab ITD轴承故障信号分解【含Matlab源码 1871期】

为发泄对上司不满,百度95后程序员删库被判9个月

flutter简单优秀的开源dialog使用free_dialog

Experience of electric competition - program-controlled wind pendulum

Develop a basic module with low code

On the exploitation of a horizontal ultra vires vulnerability

Introduction to knowledge map

实战模拟│企业微信机器人实时报错预警
随机推荐
五分钟内编写Pytorch模型
Questions and answers of the labor worker general basic (labor worker) work license in 2022
Record several interesting XSS vulnerability discoveries
deepin系统中Qt5.12无法输入中文(无法切换中文输入法)解决办法
电赛校赛经验-程控风力摆
SQL server cannot find user or group when creating windows login account
数据库学习笔记(第十六章)
硬件工程师薪资虚高,你认可吗?
IDEA远程调试spark-submit提交的jar
Write pytoch model in five minutes
Sunyuchen, head of Grenada delegation, attended the WTO MC12 and emphasized the development of digital economy
架构师必备:系统容量现状checklist
2022甘肃省安全员C证上岗证题目及在线模拟考试
Redis相关
D generate unique ID at compile time
[tool chain series] Notepad++
Electrolytic capacitor, tantalum capacitor, ordinary capacitor
Initial installation and use of redis [play with Huawei cloud]
宝塔添加一个网站:PHP项目
终于,月入 20000 !!