super go_Go 简单性的价值:来自对 Go 倍加青睐的谷歌软件工程师的自述

点击上方蓝色“Go语言中文网”关注我们,领全套Go资料,每天学习 Go 语言

Go 语言最近几年逐渐获得越来越多的开发者的喜欢。在 Go 社区前不久刚刚庆祝Go诞生10周年生日之际,谷歌云软件工程师 Benjamin Congdon 发表个人博客(11 月 11 日发表),表达了自己对 Go 倍加青睐的一些原因。他表示,“简洁”是他喜欢使用Go语言最重要的原因。原文链接:https://benjamincongdon.me/blog/2019/11/11/The-Value-in-Gos-Simplicity/ 以下是译文:

7d3e03126a9f7651fb302078d239a74a.png

使用 Go 几年后,我真的很欣赏它的简单性。我几个月前开始在工作中使用 Go,发现它真的很容易实现迭代,甚至是比 Python 和 Java 更为复杂的迭代。

当 Go 社区庆祝其成立 10 周年(https://blog.golang.org/10years)时,我正在思考是什么使 Go 变得独一无二。我认为 Go 的许多真正力量来自其设计师的理念:高度强调向前兼容性,该语言没有损害可读性的特性,并且随手可得。你真正需要的一切它都提供了(包括基本测试库,可靠的联网和同步原语以及模板等)。

向前兼容性和依赖性

我认为,相较近期的语言,Go 具有最完善的版本控制和依赖关系。我从未因为 Go 的版本更新而遇到破坏兼容性的情况。这很重要。在相似的时间段内,由于 Rust 的 API 更改,臭名昭著的 Python 2 到 3 过渡,我的项目中断了,老实说,如果 npm 升级后我的任何旧 JS 项目让我感到吃惊。

借助 Go,我注意到库趋于稳定,这似乎让人担忧。因为在 Python 和 JavaScript 领域,如果你看到 3 年未更新的库,则表明该库已死。而在 Go 生态系统中,你可能可以使用它。在其他社区中被视为停滞或忽视的事物,在 Go 这里反而是复兴的标志。

我还注意到,在 Go 中,我需要更少的依赖项,而我的依赖项本身也具有更少的依赖项。Go 没有将尽可能多的逻辑导出到外部依赖项的文化。Go 社区比其他地方更容易接受代码重复。这可能令人沮丧。有时,你只想要一个执行某种类型的环境或分析的库。很多时候,你需要自己编写该功能,或者从 StackOverflow 答案中复制/粘贴该功能。总的来说,我认为这一点还是利大于弊。更少的依赖项意味着项目闲置几个月之后被迫中断的可能性更低。

现在,这对于其他语言、社区可能有点不公平。Rust 尚未达到 Go 所具有的稳定性,这可能是因为它还不是一种成熟的语言,但它正朝着这一方向发展。Python 3 本身已向前兼容,我希望 Python 核心开发人员能从中学到关于硬破损的教训。在这方面,我对 Javascript 不太抱有希望,但是据说 WebAssembly 和 ES10 将解决我们所有的问题。

Go 的依赖管理并不是没有问题。有一阵子,depglide 的破裂确实很烦人。并且,尽管 Go Modules 很棒,但社区仍未达到 100% 的采用率。在使用 Go Modules 之前,将所有内容都保留在 $GOPATH 下的要求非常烦人,以至于我推迟了多年进入 Go 的工作。现在情况已经好转并显示出改善的迹象。

就向前兼容性而言,自 Go1 发布以来,所有 Go 代码都可以得到兼容性的保证[1],这会一直运行到 Go2,直到将来的某个不确定的时间点。这是一个强有力的承诺,至少到目前为止,这让我对这种语言的使用很放心。

“你不需要它”(但你可能想要它)

在使用 Go 一段时间后,我开始想要一些 Go 语言根本不支持的额外功能。嗯,我对 C++ 模板的排斥程度不亚于任何一个人,但是拥有基本的集合类泛型这个要求也不过分,对吧?

开箱即用的唯一两个通用数据结构是切片(slice)和映射(map)。那是否要编写自己的数据结构?要么必须针对特定类型进行设置,要么需要盯着一个全是 interface{} 的字段。这两种方法都各有所长,但有时候,我希望可以只导入类型安全的、通用的、双向 map。

Go 将“你根本不需要”[2]发挥到了极致。“需要”是这里的重点词。你“不需要”泛型,但几乎可以肯定你想要它。这样的语法糖在错误处理、函数式编程和运算符重载上都是上上之选。

那句“陈词滥调”怎么说来着?有时“少即是多”。除了命名返回值[3]之外,我想不出 Go 语言中的任何让用户抓狂的功能了。令人印象深刻的是,Go 核心开发人员对在 Go 中模仿其他语言的开发人员群体表现出了极大了约束。Go2[4] 的未来对我来说真的很令人兴奋,因为我很期待看到已经习惯的“下一代” Go 是什么样子。

包括了足够你需要的

对于 Go 令人赞叹的另一点是,它提供了几乎所有你需要的。

go test 是一个很好的(尽管是基本的)测试框架。你无需成为 JUnit 的领域专家,也无需在 noseunittest 之间进行选择。为方便起见,有一些测试断言库,例如 testify[5],你可以引入它们,但“你并不必须要”。

类似地,Go 的 sync 包涵盖了你可能需要的大多数同步原语,http提供了可用于生产环境的 HTTP 服务器和客户端(甚至支持 HTTP2),而且 encoding 包有足够多的子包可以处理 json、xml、csv 以及许多其他常见格式的数据。

格式化,格式化,格式化(老外也强调重要的事情说三遍)

最后,如果我不提到gofmt,我会很失落。在格式化方面,我有点挑剔。我并不特别在意使用哪些规则,但是我非常在乎一致性。Go 的内部格式化工具 gofmt 已被社区广泛采用,并提供了足够的一致性,使 Go 的代码“看起来”符合 Go 的习语,而不会看代码看得要抓狂。

就个人而言,我发现使用gofmt可以更轻松地阅读开源 Go 代码。每个项目仍然有自己的处理方式,但是每个项目都遵循相同的格式约定。从美学上讲,这让人很高兴。


所以,我喜欢 Go。曾经有一段时间,我对 Zen of Python[6] 非常着迷,并且对其他语言不屑一顾。我期待 Go 的美好未来,我可能以后会在 Rust 流行起来之后,去用 Rust 赶一波时髦,因为我确实喜欢一些类似于函数式的编程。

但是现在,我非常愿意继续使用 Go 语言。

文中链接

[1]

保证: https://golang.org/doc/go1compat

[2]

“你根本不需要”: https://www.martinfowler.com/bliki/Yagni.html

[3]

命名返回值: http://tour.studygolang.com/basics/7

[4]

Go2: https://github.com/golang/go/wiki/Go2

[5]

testify: https://github.com/stretchr/testify

[6]

Zen of Python: https://www.python.org/dev/peps/pep-0020/

推荐阅读

  • 深度长文:深入Go Runtime,你能做到浅出吗?

  • 为什么golang没有volatile?


喜欢本文的朋友,欢迎关注“Go语言中文网”:

7fa0df70c55e7cb26ec658b6885001f5.png

Go语言中文网启用微信学习交流群,欢迎加微信:274768166

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/539118.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断鼠标是否在元素上_是否清扫保洁、是否雾撒降尘?江城环卫车装上了北斗,动动鼠标就知道了...

楚天都市报12月1日讯(记者卢成汉 通讯员金婵 潘婷)环卫车装上北斗定位系统,它是否上路进行清扫保洁,是否雾撒降尘。城管队员通过手机或电脑,就可以查到它的运行状态。1日,东湖高新区城管执法局称,该区运行的北斗智能环…

Object 对象详解

2019独角兽企业重金招聘Python工程师标准>>> 面向对象的核心思想:“找合适的对象,做适合的事情”。 合适的对象: 1. 自己描述类,自己创建对象。 2. sun已经描述了好多常用的类,可以使用这些类创建对象。 API&#xff0…

vi/vim命令

概述 vi: Visual Interface vim: VI iMproved vim模式 有三种: 编辑模式(命令模式) 如:通过命令新增一行,删除一行,复制一行,光标移动等 输入模式 输入模式在屏幕末尾一定有这个“-- INSERT --” 末行模式 ESC&…

主mysql删除从服务不同步_MySQL主从不同步解决

由于binlog日志带多删除了几个后发现MySQL主从不同步1、由于binlog日志带多删除了几个后发现MySQL主从不同步mysql> show slave status\G;Slave_IO_Running: NoSlave_SQL_Running: Yes查看报错日志为[ERROR] Slave I/O: Got fatal error 1236 from master when reading data…

机器学习(一)梯度下降算法的实现及过程分析

机器学习(一)梯度下降算法 因为算法最好能应用到实际问题中才会让读者感到它的真实的用处,因此首先我来描述一个实际问题(梯度下降算法用以帮助解决该问题):给定一个指定的数据集,比如由若干某一…

quick time不可用_那些校园中“不可言说”的鄙视链

原标题:那些校园中“不可言说”的鄙视链俗话说,有人的地方就有江湖,有江湖的地方总有人喜欢论论剑,分个高低,更何况是聚集了五湖四海人群的大学呢!今天小U总结出了一篇高校鄙视链大全,快来看看符…

select怎么设置默认值_20200817:详细说下数据倾斜怎么解决?

福哥答案2020-08-17:数据倾斜是大数据领域绕不开的拦路虎,当你所需处理的数据量到达了上亿甚至是千亿条的时候,数据倾斜将是横在你面前一道巨大的坎。很可能有几周甚至几月都要头疼于数据倾斜导致的各类诡异的问题。数据倾斜是指:…

数据库查询某一列大写转化小写字母表示_基于MySQL数据库下亿级数据的分库分表...

移动互联网时代,海量的用户数据每天都在产生,基于用户使用数据的用户行为分析等这样的分析,都需要依靠数据都统计和分析,当数据量小时,数据库方面的优化显得不太重要,一旦数据量越来越大,系统响…

vs 启动调用的目标发生异常_协程中的取消和异常 | 取消操作详解

在日常的开发中,我们都知道应该避免不必要的任务处理来节省设备的内存空间和电量的使用——这一原则在协程中同样适用。您需要控制好协程的生命周期,在不需要使用的时候将它取消,这也是结构化并发所倡导的,继续阅读本文来了解有关…

pytorch 图像分割的交并比_Segmentation101系列-最简单的卷积网络语义分割(1)-PASCAL VOC图像分割...

作者:陈洪瀚 /洪瀚笔记知乎专栏摘要:介绍了使用PyTorch和torchvision加载训练好的全卷积网络FCN或DeepLab模型,并对PASCAL VOC图像进行分割并显示结果。网址:github代码链接, 码云代码链接陈洪瀚​www.zhihu.com一. 准备实验数据下…

系统目录结构 ls命令 文件类型 alias命令

2019独角兽企业重金招聘Python工程师标准>>> 2.1/2.2 系统目录结构 /bin:bin是Binary的缩写,该目录下存放的是最常用的命令。 /boot:该目录下存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。 …

运维老鸟教你安装centos6.5如何选择安装包

原文:http://oldboy.blog.51cto.com/2561410/1564620 ------------------------------------------------------------------------------ 近来发现越来越多的运维小伙伴们都有最小化安装系统的洁癖,因此,找老男孩来咨询,这个“洁癖”好习惯…

服务器centos怎么部署_我什么都不会,怎么拥有自己的个人博客呢

博客每个人都想拥有一个属于自己的博客,可以分享自己的心得、技术等,可以很好地展示自己的作品,但是自己又什么都不会怎么才能拥有自己的个人博客呢?一、搭建个人博客需要什么呢(1)购买服务器,个人博客可以购买香港服务…

修改yum的镜像服务器为阿里云

1、进入阿里云镜像网站 http://mirrors.aliyun.com/ 2、选择centos---help 3、安装help里的步骤进行操作 1、备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 2、下载新的CentOS-Base.repo 到/etc/yum.repos.d/ CentOS 5 wget -O /e…

java instanceof 继承_Java中的instanceof关键字

Java中,instanceof运算符的前一个操作符是一个引用变量,后一个操作数通常是一个类(可以是接口),用于判断前面的对象是否是后面的类,或者其子类、实现类的实例。如果是返回true,否则返回false。也就是说:使用…

学习笔记-JMeter 进行接口压力测试

一、压力测试场景设置 1、场景设定:进行接口压力测试时,有单场景也有混合场景。单场景就是对一个接口进行请求;混合场景需要对多个接口进行请求,在流程类业务场景会运用到 2、压测时间设定:通常时间为10-15…

四宫格效果 css_【深度教研】智力游戏“九宫格” 集体教研活动纪实

【关键词】教研要建立过程模式,规范管理,分层推进,各负其责,及时反馈,展示总结。让教研的过程成为全体教师共同成长的过程。游戏和材料不是一次性的制作和一次性的使用,其价值在于反复玩,玩中学…

sql server numeric 可存几位小数_CBA中的10大传奇队长,将篮球精神一直传递下去,你认识几位呢?...

阅读本文前,请您先点击上面的蓝色字体“十点听情感”,再点击“关注”,这样您就可以继续免费收到最新文章了。每天都有分享。完全是免费订阅,请放心关注!!!中国男子篮球职业联赛简称CBA中国篮球自…

设置ntpdate服务开机启动校验时间

一般linux都预装了 ntpdate 服务。 如果没有安装,参考博文:http://blog.csdn.net/zengmingen/article/details/52913486启动设置 1、检查系统服务里有没有ntpdate 使用命令:chkconfig --list2、设置开机启动 chkconfig 的命令详见&#xff1a…

电脑卡顿不流畅是什么原因_什么造成游戏直播画画卡顿、延迟?这三个原因了解一下...

原标题:什么造成游戏直播画画卡顿、延迟?这三个原因了解一下从事直播的朋友们相信都有所体会,直播时很容易出现画面卡顿、延迟的现象,这究竟是什么原因造成的呢?最可能是这几点!1、服务器过载崩溃说起服务器…