Go 泛型的括号选择:[ ] or ( )?
Go 语言设计者 Robert Griesemer 和 Ian Lance Taylor 近日在 Golang 官方论坛发帖讨论关于泛型及其括号使用的问题。
他们提到很多人表达了对泛型语法的担忧,特别是在类型参数声明和函数实例以及泛型的括号选择方面。
常见的计算机键盘提供了四对单字符对称括号,分别是小括号 ( )、方括号 [ ]、花括号 { } 以及尖括号 < >。基于此,他们解释了目前泛型草案在示例代码中使用小括号的原因。首先,Go 使用花括号来划分代码块、复合字面量(composite literals)和一些复合类型,因此几乎不可能在没有严重语法问题的情况下将花括号用于泛型。至于尖括号,解析器在某些情况下要求 <> 需要 unbounded lookahead。
所以只剩下 ( ) 和 [ ] 可供选择。然而缺少修饰的方括号会在数组和 slice 的类型声明中造成歧义,在解析索引表达式时也会引起小程度的歧义。因此在设计之初他们决定使用小括号,因为小括号似乎更符合 Go 语言的风格,而且看起来问题最少。
为了使小括号正常工作,并且为了向后兼容,他们表示不得不在类型参数列表中引入type
关键字。最后,他们在参数列表、复合字面量和嵌入类型中发现了额外的解析歧义,而这些歧义需要嵌套更多的小括号来解决。不过即便如此,他们还是决定继续使用小括号,因为当时还有更重要的设计问题需要解决。
现在他们决定重新考虑这个最初的决定。如果仅使用方括号声明类型参数,那么声明数组的方式如下所示:
type A [N]E
不过这就无法与泛型的声明进行区分:
type A[N] E
但如果能接受额外的type
关键字,那么歧义就会消失:
type A[type N] E
此外,使用小括号时产生的歧义似乎不会出现在方括号中。下面是一些使用方括号但不需要额外嵌套小括号的例子:
using () using []
func f((T(int)) func f(T[int])
struct{ (T(int)) } struct{ T[int] }
interface{ (T(int)) } interface{ T[int] }
[](T(int)){} []T[int]{}
为了更好地理解以及进行测试,他们表示将开始对原型实现进行修改,让泛型能使用小括号或方括号(注意不能同时混用,只能使用其中一种)。这些修改将首先提交到 dev.go2go 分支,最终会出现在 Go playground 上。
Robert 和 Ian 表示,除了使用方括号,还有另外经过充分研究的符号可以选择,这些方案能让他们做出更明智的决定。
更多讨论查看 https://groups.google.com/forum/#!topic/golang-nuts/7t-Q2vt60J8

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
Google 开源漏洞扫描系统 Tsunami
谷歌已宣布将其内部使用的Tsunami 漏洞扫描程序进行开源,以帮助其他组织保护用户数据。Tsunami将不会成为谷歌的正式品牌产品,而是由开源社区以类似于管理 Kubernetes(另一种谷歌内部工具)的方式来维护。 “我们已经向开源社区发布了Tsunami安全扫描引擎。我们希望该引擎可以帮助其他组织保护其用户数据。我们还希望促进协作,并鼓励安全界在Tsunami之上创建和共享新的探测器。” 与其他漏洞扫描程序不同的是,Tsunami本就是秉承着以大型企业为使用对象的初衷而进行构建的,旨在查找包含数十万个设备的大型网络中的漏洞。谷歌方面表示,其设计的漏洞扫描程序具有极强的适应性,Tsunami 能够扫描多种设备类型,而无需为每种设备运行不同的扫描仪。 Tsunami在扫描系统时执行两步过程: 第一步是侦查,在此期间,Tsunami会扫描公司网络中的开放端口。此后,它会测试每个端口并尝试识别在它们上运行的协议和服务,以防止因错误标记端口和测试设备的漏洞所造成的假漏洞。 第二步是漏洞验证,在这里 Tsunami 使用通过侦察收集的信息来确认是否存在漏洞。为此,漏洞扫描程序会尝试完整地良性...
-
下一篇
Android 版 Firefox bug:后台运行或屏幕锁定时,相机保持活动状态
Mozilla 近期在修复 Android 版 Firefox 上的一个 bug,该 bug 导致用户切换应用程序或锁定手机屏幕后,摄像头仍处于活动状态。 这个问题在一年前被发现,并由用户 Trishul报告到了 Bugzilla。根据他描述的重现步骤,在 Android 版 Firefox 上打开任意视频聊天网站,然后切换应用至后台运行,接着通过其他设备(例如桌面端)连接到同一聊天室,就会发现 Android 那边的视频流仍在传输。甚至将手机锁屏后,也会出现同样的情况。 消耗带宽是一方面,这个 bug 暴露了更大的隐私问题。许多用户选择在移动浏览器而非应用程序上进行视频流传输,也在一定程度上是出于隐私考虑,因为应用程序会请求更多权限,获取更多手机内的数据。 在面对外媒ZDNet 的采访时,Mozilla 表示,像其他专门的视频会议应用程序一样,他们也会提供系统通知,让用户知道 Firefox 中的网站在何时访问摄像头及麦克风。但当屏幕锁定时,通知就会被隐藏起来。这是他们认为自己做得不够好的地方。 在提出一年后,这项 bug 近几天又被重新开始讨论起来。Mozilla 目前打算通过在屏...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2整合Redis,开启缓存,提高访问速度
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- MySQL8.0.19开启GTID主从同步CentOS8
- Dcoker安装(在线仓库),最新的服务器搭配容器使用
- Hadoop3单机部署,实现最简伪集群
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G