最后更新:2020-03-07 10:57:00 手机定位技术交流文章
铁锈开发者的围棋初始体验

CSDN
1583466896作者|尼克·卡梅伦
编辑|郭蕊
在过去的几周里,我一直在用围棋语言编写程序这是我第一次在大型重要项目中使用围棋。在研究《铁锈》的特点时,我也阅读了很多关于围棋的内容,包括经验范例和编写玩具程序。但实际上用它编程是一种完全不同的体验。我认为写下这段经历会很有趣在这篇文章中,我将尽我所能避免在围棋和锈病之间做太多的比较。然而,当我从《生锈》转到《围棋》时,我不可避免地也会加入一些比较。应该提前声明,我更倾向于铁锈,但我会尽力做到客观。
总体印象
使用Go编程感觉棒极了这个库程序拥有我想要的一切,并且总体实现相对完美。学习经历也很顺利,不得不说,围棋是一门精心设计的实用语言例如:一旦你知道围棋的语法,你就可以把其他语言的惯用表达扩展到围棋。只要你学会一些围棋,你就可以相对容易地推断围棋语言的其他特点。有了其他语言的一些知识,我可以不用太多谷歌就能阅读和理解Go代码与C/C++、Java、Python等相比,围棋的难度更小,效率更高。然而,它仍然与这些语言处于同一时代。虽然它从其他语言中吸取了一些教训,甚至我个人认为它可能是那一代语言中最好的,但它绝对属于那一代语言这是一种渐进的改进,而不是创新(需要明确的是,这并不意味着对其价值的批评)。从软件工程的角度来看,逐步改进通常会带来良好的效果)一个很好的例子是零:像Rust和Swift这样的语言删除了概念并消除了一整类相关的错误Go降低了一些风险:有新值,区分0和0然而,它的核心思想没有改变,空指针引用的公共运行时错误也会发生。
容易学
围棋很容易学。我知道人们经常吹捧这一点,但我对自己工作效率的快速提高感到震惊。多亏了围棋语言及其文档和工具,我只用了两天时间就写出了“有价值的”和可提交的代码。几个有助于学习的因素是:
go非常简单许多语言试图让自己看起来很小,但围棋确实做到了(这基本上是一件好事,我对这种自律精神印象深刻)
标准库非常优秀(也非常小)从生态系统中很容易找到和使用图书馆程序。
几乎没有其他语言没有的东西。Go从其他现有语言中提取了大量内容,对其进行了改进,最后将它们很好地结合起来。它尽了很大努力避免非正统。
冗长乏味的样板代码
Go代码将很快变得非常重复这是因为它缺乏减少重复的宏或通用机制(尽管接口有利于抽象,但它们在减少代码重复方面并不那么有效)最后,我将编写许多函数,它们甚至完全相同,只是类型不同。错误处理也会导致重复许多函数都像if err!像= nil {return err}这样的样板代码比真正有价值的代码还要多。
使用泛型或宏来减少样板代码有时受到批评,理由是代码不应该变得不可读以使其易于编写。我发现围棋提供了一个反例。复制和粘贴代码通常又快又简单,但是阅读代码令人沮丧,因为你必须忽略许多不相关的代码或者在许多相同的代码中发现细微的差异。
我喜欢什么
编译时间:绝对快,绝对比生锈快得多但事实上,它并没有我预期的那么快(对于大中型项目,我觉得它的速度只有接近C/C++的速度,或者稍微快一点)我甚至更期待实时编译)
Goroutine和channel:值得称赞的是,go为生成例程和使用通道提供了轻量级语法虽然这只是一个小细节,但它使围棋的并发编程体验比其他语言更好。它真正揭示了语法的力量。
接口:它们并不复杂,但是易于理解和使用,并且在很多地方都非常实用。
if...;...{}语法:将变量的范围限制在if语句中确实很好。这与if let in Swift和trust具有相似的效果,但使用更广泛(Go没有像Swift和trust那样的模式匹配,因此它不能使用if let)
测试和文档注释易于使用
Go工具链非常友好:将所有东西放在一个地方,而不用在命令行上使用多个工具
有一个垃圾收集器(垃圾收集器):它确实使编程变得更容易,而不用考虑内存管理。
可变参数
我不喜欢的
以下的内容没有特定的顺序
0零切片:要知道零、零切片和空切片都是不同的,我可以向你保证我们只需要它们中的两个,而不是第三个。
枚举类型不是第一个公民:使用常数来模拟枚举感觉像是倒退。
不允许循环引用:这实际上限制了包在项目模块分区中的可用性,因为它鼓励了包中大量文件的积累(或者有大量碎片包,如果应该放在一起的文件分散在各处,这同样是不好的)
开关允许丢失匹配
for...range语句返回一对“索引/值”只获取索引很容易(只需忽略值);但是,为了只获取值,您需要显式声明在我看来,这种方法应该颠倒过来,因为在大多数情况下,我需要的是值而不是索引。
语法:
定义与用法不一致
编译器有时很关键(例如,要求或禁止尾随逗号);这种麻烦可以通过好的工具来缓解,但是有时仍然会有一些烦人的额外步骤。当
使用多值返回类型时,类型上需要括号,但在return语句中不需要
声明一个结构需要两个关键字(类型和结构)
使用大写命名法来标记公共或私有变量,这看起来像匈牙利命名法,但更糟
隐式接口我知道它也出现在我喜欢的事物中,但是有时候它真的很烦人——尤其是当你试图找出实现接口的所有类型,或者对于给定的类型实现了哪些接口的时候。
您不能在不同的包中用接收器编写函数,因此即使接口是“鸭类型”,您也不能在其他包中为类型实现这个接口,这大大降低了它们的有用性。
,正如我前面提到的,Go缺少泛型和宏
一致性
作为一名语言设计师和程序员,围棋最让我惊讶的可能是其内置功能和用户可用功能之间经常出现的不一致。许多语言的目标之一是尽可能消除编译器的魔力,这样用户也可以使用内置的特性。运算符重载是一个简单但有争议的例子但是围棋有很多魔力!您很容易遇到无法完成内置功能的问题。
给我印象最深的是,
用很好的语法返回多个值和通道,但是这两者不能一起使用,因为没有元组类型。
可以使用...range语句迭代数组和切片,但是它不能对其他集合做任何事情,因为它缺少迭代器的概念。像len或append这样的
函数是全局函数,但是您自己的函数不能转换为全局函数这些全局函数只能使用内置类型即使Go“没有泛型”,它们也可以成为泛型
没有操作员超载,所以= =会让人感到恼火。因为这意味着您不能在字典中使用自定义类型作为键,除非它们是可比较的。此属性派生自类型结构,不能由程序员重写。
摘要
Go是一种简单、小巧、愉悦的语言它也有一些角落,但大多数都是精心设计的。它的学习速度令人难以置信,并且避免了其他语言中一些不太知名的特征。
Go也是一种与Rust非常不同的语言虽然两者都可以被概括为“系统语言”或“C语言的替代品”,但它们的设计目标、应用领域、语言风格和优先级是不一样的。垃圾收集确实带来了巨大的不同:使用垃圾收集使围棋变得更简单、更小、更容易理解。没有气相色谱,生锈的速度非常快(尤其是当你需要保证延迟,而不仅仅是高吞吐量的时候),并且可以支持在围棋中不可能实现的特性或编程模式(或者至少不能在不牺牲性能的情况下实现)
Go是一种编译语言,它的运行时间已经很好地实现了,它的速度是毫无疑问的。Rust也是一种编译语言,但是运行时要小得多。它真的很快没有任何其他限制,我认为选择Go或Rust实际上意味着一种权衡:一方面,Go具有更短的学习曲线和更简单的程序(这意味着更快的开发速度);另一方面,Rust在性能上非常优秀,类型系统更有表现力(这使得程序更安全,也意味着更快的调试和错误发现)
声明:本文来源于PingCAP,由作者提交。版权属于作者。
腾迅云“拯救”微联盟!766在线会议,配置100多台服务器,闹钟只敢设置2小时
重磅炸弹!教育部再次批准了179个新的人工智能本科专业
人工智能改变未来教育的五大方式!
Linux会成为主流桌面操作系统吗?
6步骤,教您在Ubuntu虚拟机环境中使用Docker自己的域名系统配置代码为
的Hadoop |开发项目时,如何选择区块链平台。我们分析了三个有趣的平台:以太网、RSK比特币和Ardor,给你一个答案!
本文由 在线网速测试 整理编辑,转载请注明出处。