这是一个为Go构想更好未来的三篇文章系列的结尾篇。在前面的文章中,我们讨论了这门语言的强项,并提出了其中存在的问题。如果你错过了这些内容,我建议你回头看一下,因为它们为本文提供了重要的背景。
· 什么使Go成为最佳语言
· 我们需要谈谈Go的不足之处
· 为Go构想一个更好的未来
如果你将社区的约定和命名问题与上一篇文章中提到的异步返回值问题结合起来,你会发现极受欢迎的库发布了包含复杂、超过100行的函数的代码,使用一个字母的未文档化变量,这些变量在包的另一侧声明。这使代码变得难以阅读和维护,且出奇地普遍。此外,与其他现代语言不同,Go并不提供任何形式的运行时值安全性。这导致了许多与值相关的运行时问题,这些问题本可以轻易避免。
我认为,作为一门语言和一个社区,Go非常努力地想要区别于其他语言。这种“其他语言有缺点,我们会完全不同地做*”的方法。其他语言是否在设计上犯了错误?当然,而且公认地有 — 空指针 和在C#与Java中的检查异常是此类被其设计者认为是错误的决策的流行例子。
面向对象的方法是否在过去的几年中被滥用?答案是被严重滥用!在他的一次著名演讲中,Rob Pike(Go的联合设计者)说:
如果C++和Java关于类型层次和类型分类,Go则关于组合。
的确,组合和继承只是克服代码重复的不同方法。组合有其优点和缺点。在Pike的这一声明十年后,我听到很多Go开发者抨击Java或C++及其面向对象的方法,声称人们滥用继承。让我们明确一点 — 人们同样会滥用组合。只需给他们时间。😌 由于函数式编程的崛起,几十年的组合主导继承可能会达到这一目的。与此同时,我认为盲目拒绝其他语言的良好实践和习惯并不会带来任何好处。相反,我们应该仔细考虑我们应该采纳什么。许多其他语言的几十年经验一定有其价值。在我看来,这确实很有价值。
我本希望看到一个主要类似于Go的编译时环境,但允许开发者更具表现力,以增加可维护性和运行时安全性。但与此同时,允许Go语言本身在很大程度上保持不变,而不是演化成新的东西,这是我们许多Gophers所担心的。作为Gophers,为什么不在我们的工具集中拥有两个工具呢?🔧🪛
Goat — 扩展版本的Go编程语言,旨在增加值安全性和可维护性
介绍 — Goat。一个新的编译时环境,将产生标准、兼容和高性能的Go文件,这些文件与任何其他Go项目完全兼容。这意味着它们可以导入常规的Go文件,但也可以从任何其他Go文件安全地导入。希望围绕Goat的设计和规范引发深入的讨论,并听取每个人的意见。无论是Gophers还是非Gophers。
Goat可以以多种方式实现,从完全转译的编程语言到简单的Go代码生成工具。然而,此时我们故意避免深入讨论实现细节,而希望专注于规范。想象自己身处这样一个充满无限可能性的令人兴奋的Go编码环境中,你看到了什么? 通过开启新的GitHub问题来提出新的语法和约定规则,或者加入已开启问题的讨论。你会在Go的编译时改变什么来提高安全性和可维护性,以及为Goat的成形规范贡献你的观点。
让我们花一分钟的时间回顾上一篇文章中提出的解决方案,并讨论它们的一致性和简单性。我们要确保给Go留下空间,保持它简单、一致和无碎片化。我们不应该有多于一种可能的方式来表达某事。
· 添加可见性修饰符 - 为了保持无碎片化,可见性应该仅通过可见性修饰符派生。换句话说,大写和小写符号不会影响它们的可见性。
· 将内置符号移动到作用域方法和函数 - 内置函数(如cap
、len
和make
等)的行为应该只作为它们各自类型的方法和函数提供。获取切片长度的唯一方式应该是通过调用slice.Len()
。内置符号将不可用。
· 添加严格的nil支持 - 有几种不同的方法可以在不同层次的复杂性上实现这一点。不管怎样,编译器应该阻止将nil值分配给非可空变量,并防止在没有初始检查的情况下取消引用可空变量。对于不熟悉类似机制的人,可能需要一两分钟来理解。无论如何,这个过程中都不应该引入碎片化。
· 添加enum支持 - enum支持不应与Go中现有的任何机制重叠。当你声明一个类型,它必须持有几个可能的值之一 - enum应该是你的选择,因为没有其他机制支持它。
· 在结构体中支持初始值 - 必须将强制结构体字段的初始值的机制集成到现有机制中。换句话说,我们应该支持在当前结构体语法中计算和提供结构体字段的初始值。不应引入任何重复或碎片化。
· 添加const赋值 - 每一个变量的声明都应该指示它是一个常量还是一个变量。基于这一点,我会补充说这需要移除对速写变量赋值的支持(:=
操作符),这在Go语法中目前会产生碎片化。
· 为go
关键字添加promise支持 - 重要的是要注意,添加promise的支持不会引入新的并发模型。相反,它应该简单地提供内置支持,用于跟踪已触发的goroutines的执行并获取其结果。Go目前不支持这一点,添加它应该是一致的和无碎片化的。
充分披露 - 我是在写这个系列文章时才知道vlang项目的。在写这些词的时候,我仍在学习vlang的具体内容,并且我一直在寻找类似的项目。vlang是一种令人惊叹和强大的语言,据我了解,它在编译时和运行时环境都有精美的设计。也就是说,vlang
和类似的项目与Goat之间存在根本的区别。虽然其他项目努力创建新的和令人兴奋的语言,Goat的全部目标是赋予权力给现有的语言。我相信Go是一种出色的语言,具有强大的运行时和惊人的生态系统。我不希望失去任何这些。
在总结了Go的优点和缺点之后,我们希望把精力集中在定义Goat的规范上 - 一个扩展版本的Go,旨在增加值安全性和可维护性。这个项目将允许Go保持简单和高效,同时允许社区尝试一个扩展版本。Goat的规范应该由社区驱动,所以它需要任何Gopher和非Gopher的意见和贡献。
联系客服