go的设计哲学
一门语言的设计哲学相当于一个人的价值观。
简单、显式、组合、并发和面向工程
简单
知名 Go 开发者戴维·切尼(Dave Cheney)曾说过:“大多数编程语言创建伊始都致力于 成为一门简单的语言,但最终都只是满足于做一个强大的编程语言”。
java就是这样,对其他语言的特性进行吸收。比如java8的lambda
go仅有25个关键字,是主流语言最少的
内置垃圾回收,降低程序员进行内存管理的心智负担
内置并发编程支持
首字母大小写决定可见性、变量初始为类型零值
显式
go不支持隐式的类型转换。需要手动进行显式的类型转换
隐含的设计哲学是:程序员应该明确知道自己在做什么。
组合
go中没有继承。go不是面向对象的语言。
通过组合,将已经实现的功能嵌入到新类型中,以快速开发功能强大的新类型。
这种机制在某种层面上类似与继承的机制,但是在原理上截然不同。被嵌入的类型和新类型之间完全没有关系,完全没有父类子类的继承关系,当然也不存在向上或向下的类型转换。
通过多个小接口,组合成一个大接口。
并发
go中多线程编程写起来非常舒服。
“并发”这个设计哲学的出现有它的背景,CPU 都是靠提高主频来改进性能的, 但是现在这个做法已经遇到了瓶颈。主频提高导致 CPU 的功耗和发热量剧增,反过来制约 了 CPU 性能的进一步提高。2007 年开始,处理器厂商的竞争焦点从主频转向了多核
在这种大背景下,Go 的设计者在决定去创建一门新语言的时候,果断将面向多核、原生支 持并发作为了新语言的设计原则之一。并且,Go 放弃了传统的基于操作系统线程的并发模 型,而采用了用户层轻量级线程,Go 将之称为 goroutine。
goroutine 占用的资源非常小,Go 运行时默认为每个 goroutine 分配的栈空间仅 2KB。 goroutine 调度的切换也不用陷入(trap)操作系统内核层完成,代价很低。因此,一个 Go 程序中可以创建成千上万个并发的 goroutine。而且,所有的 Go 代码都在 goroutine 中执行,哪怕是 go 运行时的代码也不例外。
java的线程是内核态的,线程的切换需要进行用户态和内核态的切换?
面向工程
go语言被开发出来的目的是为了解决当时在google内部遇到的大规模软件开发流程中遇到的问题,比如大型项目代码构建慢,依赖管理混乱,代码复杂难以理解等。
所以go天生就是为了解决工程化项目而生的。
这一点完全区别与很多偏学院派或者说研究型语言。
重构方便:别名
构建快读:重新设计编译单元和目标文件格式,实现 Go 源码快速构建,让大工程的构建时间缩短 到类似动态语言的交互式解释的编译速度;
标准库丰富
工具链完备