hello云胜

技术与生活

0%

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 源码快速构建,让大工程的构建时间缩短 到类似动态语言的交互式解释的编译速度;

标准库丰富

工具链完备