共计 1596 个字符,预计需要花费 4 分钟才能阅读完成。
本文视频地址
Go 语言从诞生到明天曾经有十年多了,Go 语言的魅力使得其在全世界范畴内领有了百万级的反对用户。那到底是什么让大量的开发人员学习 Go 或从其余语言转向 Go 语言呢?本源就在于 Go 语言的设计哲学。
对于 Go 语言的设计哲学,Go 语言之父们以及 Go 外围团队的开发者们并没有给出明确的官网说法。但在这里我将依据我集体对他们以及 Go 社区支流观点和代码行为的整顿、剖析和总结,列出三条 Go 语言的设计哲学。了解这些设计哲学将对读者造成 Go 原生编程思维、编写高质量 Go 代码起到踊跃的影响。
第一条准则: 简略,少即是多
通常当咱们向 Go 语言爱好者 们提出这样一个问题:“你为什么喜爱 Go 语言”后,咱们会失去很多种答案,诸如:
- 编译速度快
- 执行速度快
- 繁多二进制文件,部署简略
- 好棒的工具集
- 自带的规范库超级弱小
- 内置并发
- interface 很棒
- 跨平台 Easy
- … …
排名靠前而又占据少数的答案是“Go 很简略”,这也和官网 Go 语言考察的后果是统一的。
和其余语言比方 C++、Java 等相比,通过一直减少新个性来吸引程序员的支流编程语言相比,Go 的设计者们在语言设计之初就抉择回绝走语言个性交融的这种路线,抉择了“做减法”,抉择了“简略”,让使用者用起来足够的 – 简略,他们把复杂性留给了语言本身的设计和实现,留给了 Go 外围开发组本身,而将简略、易用和清晰留给了宽广 Go 语言使用者们。因而,明天出现在咱们在眼前的是这样的 Go 语言:
- 简洁 – 它仅有 25 个关键字
- 内置垃圾收集,升高开发人员内存治理的累赘
- 没有头文件
- 显式依赖(package)
- 没有循环依赖(package)
- 常量只是数字
- 头字母大小写决定可见性
- 任何类型都能够领有办法(没有类)
- 没有子类型继承(没有子类)
- 接口是隐式的(无需“implements”申明)
- 办法就是函数
- 接口只是办法汇合(没有数据)
- 办法仅按名称匹配(不是按类型)
- 没有构造函数或析构函数
- 赋值不是表达式
- 在赋值和函数调用中定义的求值程序(无“序列点”概念)
- 内存总是初始化为零值
- 没有 const 或其余类型注解语法
- 没有模板 / 泛型
- 没有异样(exception)
- 内置字符串、切片 (sl 典(map) 类型
- 内置数组边界查看
- 内置并发反对
- … …
任何的设计都存在着利弊的斗争。咱们看到 Go 设计者抉择的“简略”体现在去除或优化了以往语言中已被开发者证实为体验不好或难于驾驭的语法元素和语言机制,并提出了本人的一些创新性的设计(比方:头母大小写决定可见性、内存调配初始零值、内置以 go 关键字实现的并发反对等)。
Go 设计者应用“最小准则”的形式,即一个事件仅有一种形式或数量尽可能少的形式去实现,这大大减少了开发人员在门路形式抉择上以及了解其他人所抉择门路形式上的心智累赘。
Rob Pike 曾说:“Go 语言实际上是简单的,但只是让大家感觉很简略”。这句话背地的深意就是“简略”抉择的背地则是 Go 语言本身实现层面的简单,而这些复杂性被 Go 语言的设计者“暗藏”起来了,就比方咱们通过一个简略的关键字“go”就能够搞定并发,这种简略的背地其实是 Go 团队周密设计和继续付出的后果。
此外,Go 的简略哲学还体现在 Go1 兼容性 2 的提出。对于面对工程问题解决的开发人员来说,Go1 大大降低了工程层面上语言版本升级所带来的耗费,让 Go 的工程实际变得分外简略。
Go1 兼容性阐明摘录
Go1 定义了两件事:
第一,语言的标准;
第二,一组外围 API 的标准,即 Go 规范库的“规范库”。
API 可能会增长,减少新的包和性能,但不会以毁坏现有 Go1 代码的形式进行。
从 Go 1.0 公布至今,Go1 兼容性始终被很好地恪守着,当初应用 Go 1.4 编写的代码现在也能够顺利地通过最新的 Go 1.15 版本的编译并失常运行起来。
Go 语言的这种创新性的“简略”设计并不是一开始就能失去程序员的了解的,但在真正应用 Go 之后,这种身处设计哲学层面的“简略”便延长到 Go 语言编程利用的方方面面,继续影响着 Go 语言编程思维的造成。