大家好,我是煎鱼。

之前春节假期,在家闭关多日。看到了在 2021 年 6 月 Go 语言之父 Rob Pike 在 UNSW Computing(悉尼新南威尔士大学计算机)组织的分享会议,介绍了他对现在 Go 编程语言和环境的一些看法。

今天煎鱼结合大佬的演讲《The Go Programming Language and Environment》和一点个人理解给大家分享一波,包含 Go 发展、生态、看法等多方面知识。

Go 怎么样

Rob Pike 表示其实 Go 目前还不能算做主流语言,但是在全世界的影响力和发展都大大的超出了预期。

像在国内的我们,能够很明显感知到,Go 在近 3~5 年的用户群体不断增大。我早年在 Segmentfault 上发文章,过了 1~2 周,我的 Go 文章,也还在第一页的前几位,发文的人比较稀少,但现在人非常多了。

大家会发现,Go 并不是那种非常 “有趣” 的语言,在技术上(语言理论、设计)几乎没有什么大进步。当然,这也不是 Go 核心团队的设计目标。

但就是这么一门语言,他主导了大部分 CNCF 中的项目,例如:K8s、Docker 等,特别牛。Go 是云基础设施的语言,这是怎么发生的

Go 为什么成功

Go 从一门无人问津的语言,到现在承担了各云基础设施的核心,变得很重要,也是一种成功实践。

Rob Pike 认为成功的因素有如下:

Rob Pike 在 Google 工作时,当时遇到了上述 PPT 截图中的许多问题,像是:软件规模、长期兼容性、应用构建缓慢等许多方面。

核心观点:一门编程语言的成功取决于其他很多方面,Go 语言是面向软件开发的,而不仅仅只是编程

为此,Go 就是为了解决软件开发而生,而非只是编程,这是成功的关键因素。

Go 要解决的难题

他们遇到的一个大问题就是 Scale(规模),规模又分为了 3 大块问题。

分别是:

  • 并发(Concurrency)。

  • 工程(Engineering)。

  • 依赖(Dependencies)。

并发

在 2007 年,软件规模的扩大的情况下,Google 的生产集群出现了多核 CPU。

当时没有成熟的主流语言可以将多核全部正确使用,导致 Google 即使拥有这些庞大的计算集群,硬件资源的利用率也非常低。

线程模型和库很神秘,很复杂,很困难。由于环境的要求,生产代码中不被允许使用线程,而是启动多个二进制文件。

工程

Google 在软件开发上采取的是 Menorepo 的单仓库分包的模式,因此会有成千上万的程序员在同一个代码库中工作,每天都有数不清的变化。

但是当时用的都是 C++、Java 等这类语言,太难自动化和分析,很难带来工具的帮助。

依赖

软件规模下的大量依赖,给 Google 带来了很大的麻烦。

Java 和 C++的开发速度很慢,C++ 代码的每一个字节都变成了 2000 个字节。

没有办法知道依赖性是否是必要的,感觉是很糟糕的。

Go 初始特性

Go 的大部分核心特性,其实是大佬们在 2007 年 9 月的一个下午,在白板上画了草图和讨论出的。

如下:

  • 语法、语义。

  • 并发性。

  • 封装。

  • 垃圾回收。

  • 工具化。

  • 自动化,包括格式化。

接口化

在日常的 Go 程序(标准库、第三方库、应用程序等)中,存在着许多微小的接口,可以让我们做许多的事情,像是写入图片都可以写入到任意地方。

这种接口化,也就是常说的鸭子类型(duck typing):像鸭子走路,像鸭子叫(长得像鸭子),那么就是鸭子。

构成了 Go 的应用文化。

类型支持

在类型设计上,Go 与其他编程语言有着很根本的一个差异,那就是不能不同类型混合在一起做运算操作:

要跨类型的话,必须做显示转换,不存在明确的隐式转换。

并发

Go 要用协程做并发、并行等动作,非常方便,不需要几行代码。

普通的工程师都能上手:

这是一个很重要的杀手级特性和卖点。

安全性

在设计时,Go 对安全性考虑了许多。一般来讲,是没法做一些不安全的事情,但硬要做,就必须引用 unsafe 的库:

使用 Go 会比 C/C++ 简单许多,既安全又省心。如果出现了 unsafe 的引用,就能明确知道这个程序是 “不安全” 的。

完整性

Go 基于前面所提到的接口化,面向网络、密码学、文本处理、格式化 IO 等实现了一系列的核心基础库:

主体指的是 Go 把常用的都覆盖全了,非常高效全面。

一致性

跨系统的编译,只需要稍微调整 2 个环境变量,就可以在 A 系统打出 B 系统能运行的二进制文件,并且行为一致,也不用担心垃圾回收。

Rob Pike 还介绍了自己平时都是在 MacOS 下开发,会经常打一个 Linux 的二进制文件部署到服务器上去运行,非常方便。

兼容性

Go 在 2012 年发布 Go1.0 起,就起草了一份 Go1 兼容性保障的文档,以此作为对用户的承诺。将在 Go1 内不会出现破坏性修改,你 10 年前的代码能跑,10 年后也能跑,非常舒服。

从现在来看,也是做到了。

开发工具

配套的 Go 开发者工具,是具有标准化的,不像某些语言左一个右一个的,非常混乱。

Go 工具链都是 go build、go fmt 等模式。

依赖库

官方有大量的标准库提供,用户可以自定义第三方库。依赖的管理方式是非集中式的,可以在每个人的 URL(例如:GitHub 等),不存在抢占注册的风险。

有一点遗憾的是,在早期库依赖时,理论上但就应该包含模块的依赖管理。但当时没有做到,现在有了,也算是 OK 了。

主题

如果希望把 Go 这门语言的生态系统做起来,就要在社区中运转,能够让其他人做出贡献。

这里最常见的就是 IDE 的各种 Go 插件,以及平时我们正在使用的第三方库,他人开发的工具等,都可以拿来就用。

文化

Go 社区文化的构建,本质上 Go 现在作为云原生应用的基础,构建了现代的云环境,是由社区主动发起的。

共同维护更美好的愿景,一种安全、兼容、可移植性和可读性的文化。

总结

在设计一门语言时,不单单只是设计他,必须要培养他,把其身边的生态系统都做起来,让他变得繁荣。

像是 Go,快速、高效、可移植性、部署简单、长期兼容、简单抽象、好用工具、容易测试、容易自动化、很好用的依赖库等。这些东西共同构成了他的文化,也会使他做的更好。

Rob Pike 表示:Go 是关于软件开发的,而不仅仅是编程,这是 Go 的核心精神和理念。

一些交流

  1. 泛型:之所以一开始没有放进特性里,是因为不知道怎么会对他感到不舒服,不确定性极高。但经过 10+ 年的努力,现在已经有了一个基本设计和模型,很有可能会打破一切,Rob Pike 也非常好奇后续的效果。

  2. 声明变量:当前声明的方式比较多,甚至有想砍掉一些。

  3. Channel:认真的尝试过把 channel 和 network 协作,但是一直没有找到好的办法。

  4. GOPATH:Go1.14 以前,会是 GOPATH 的原因,是因为几个开发者确实是在 Google 工作,Google 采取的是 Menorepo 的模式,没有分布式模型的原生态。

参考

  • The Go Programming Language and Environment

关注煎鱼,获取业内第一手消息和知识

Go 之父:聊聊我眼中的 Go 语言和环境相关推荐

  1. 三大视角,聊聊我眼中的广告系统

    作者 | wulc 整理 | NewBeeNLP 从实习到工作,接触过一些大大小小的广告系统,有麻雀虽小但五脏俱全的小 dsp,也有把 ssp.adx.dsp 都打包了的大媒体 ,算是对业界的广告系统 ...

  2. 聊聊我眼中恺明大神MAE的成功之处

    卷友们好,我是rumor. 这两天忍不住又卷去看CV领域的论文了,主要是前些日子恺明大神的MAE太过强大,感觉不看会错过一个亿.看了之后果然不负我的期待,大道至简,思路太清晰了.太深刻了,给他投光我的 ...

  3. sql 树状结构中知道 父节点与孙节点_集群环境中使用Zookeeper实现分布式幂等控制...

    一.什么是Zookeeper? Zookeeper(业界简称zk)是一种提供配置管理.分布式协同以及命名的中心化服务,这些提供的功能都是分布式系统中非常底层且必不可少的基本功能,但是如果自己实现这些功 ...

  4. 10+ 条 Go 官方谚语,你知道几条?

    作为一个 Go 语言开发工程师,总是在入门.深入.撕提案时能够听到各种带有 Go 特色的话语,例如:少即是多(less is more),非常有趣. 今天带来了 Go 语言之父 Rob Pike 在 ...

  5. 开发者眼中的“道、法、术、器”

    "道.法.术.器",出自老子的<道德经>,是我们老祖宗的智慧结晶.经过了两千多年的历史,细细想来,依然是那么具有深意! 今天我就结合开发者的视角,给大家聊聊开发者眼中的 ...

  6. 力争上游 ——我眼中的“计算机产业链”

    力争上游 --我眼中的"计算机产业链" Google前研究员,腾讯现任副总裁吴军博士写了一本介绍IT行业数十年风云变幻的<浪潮之巅>,其中有一章介绍个人电脑工业的生态链 ...

  7. 聊聊Service Mesh:linkerd

    [编者的话]随着企业逐渐将传统的单体应用向微服务或云原生应用的转变,虽然微服务或者云原生应用能给企业带来更多的好处,但也会带来一些具有挑战的问题,如怎么管理从单体应用转向微服务所带来的服务间通讯的复杂 ...

  8. html 相对于父标签位置,css子元素如何相对父元素定位?

    在css中,可以使用position属性,通过给父元素设置相对定位"position:relative;"样式,给子元素设置绝对定位"position:absolute; ...

  9. 大神程序员,夜夜coding到天明?Python之父昼伏夜出,PHP创始人24小时都在线

    栗子 鱼羊 发自 凹非寺 量子位 出品 | 公众号 QbitAI 大神程序员,夜夜coding到天明? 有位名叫Ivan Bessarabov (简称"伊万") 的好事者,刚刚统计 ...

最新文章

  1. DNS Tunnel判定方法
  2. Ogre 编辑器二(用Ogre的地形组件加载天龙八部地形)
  3. SQL基础--层次化查询(START BY ... CONNECT BY PRIOR)
  4. NYOJ 23 取石子(一)
  5. 视频分类/动作识别数据库研究现状
  6. 比较排序算法的时间复杂度 c语言,c语言四种排序算法时间复杂度比较(10页)-原创力文档...
  7. LeetCode 341. 扁平化嵌套列表迭代器(双栈)
  8. 什么是mybatis,mybatis有什么特点
  9. App for Android (1) —— 环境搭建
  10. java 蓝桥杯算法训练 奇变的字符串(题解)
  11. arm rtx教程_【RTX操作系统教程】第5章 RTX操作系统库方式移植(超级...
  12. Mugeda(木疙瘩)H5案例课—世界名画抖抖抖起来了-岑远科-专题视频课程
  13. 一台电脑中,如何使 git 同时配置Github、Gitee等多种版本控制工具
  14. Godaddy怎么解析域名指向自己的服务器?
  15. 画一个神经元的结构简图,神经元的简图画法
  16. US Shirt Size
  17. qt for android 中无法运行和调试应用程序,No Device Found,The adb tool in the Android SDK lists all......
  18. 一张照片就能攻破人脸识别系统,人脸识别安全性亟需提高
  19. 算法很美 将整数的奇偶位互换
  20. 【舒利迭】 沙美特罗替卡松粉吸入剂 (50微克 250微克)

热门文章

  1. Eclipse Debug maven test
  2. JDBC、DriverManage、JNDI、数据源(DataSource)、连接池的区别
  3. 前端MVC Vue2学习总结(四)——条件渲染、列表渲染、事件处理器
  4. 如何在Linux下安装PyCharm
  5. 线程基础知识系列(三)线程的同步
  6. 10 个非常有用的 AngularJS 框架
  7. 国内免费Blog博客程序评测(含ASP/PHP/.net)
  8. Android开发学习:在Eclipse中导入Android项目方法
  9. POJ - 3259 Wormholes(判断负环)
  10. 吐槽今年一级计算机,吐槽大会#辽宁省考#当一个没有情感的计算机器