2

Go Base

 3 years ago
source link: https://studygolang.com/articles/32347
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Go又称为Golang,是Google的Robert Griesemer、Rob Pike、Ken Thompson开发的一种静态编译型语言,Go语法与C类似,功能具有内存安全、垃圾回收、结构心态、并发计算的编程语言。

Go起源于2007年,并在2009年正式对外发布,其目标是“兼容Python等动态语言的开发速度和C/C++等编译型语言的性能和安全性”。

Go又被称为“C类似语言”或“21世纪的C语言”,Go从C继承了相似的表达式语法、控制流程结构、基本数据类型、调用参数传值、指针等多种思想,还有C一直所看重的编译机器代码的运行效率,和现有操作系统的无缝适配。

Go没有类和继承的概念,因此和Java或C++看起来并不相同,但它通过接口实现了多态。Go具有清晰易懂的轻量级类型系统,在类型之间没有层级关系,因此Go是一门混合型语言。

编译型

Go和C一样是编译型静态语言,因此在运行Go程序前必须将其编译为二进制的可执行文件。

Go使用编译器来编译代码,编译器将源代码编译成二进制字节码格式,编译代码时编译器会检查错误、优化性能并输出不同平台上运行的二进制文件。

Go提供了 go buildgo run 命令对Go程序进行编译

go build
go run

语言特性

Go是一种静态强类型、编译型、并发型、具有垃圾回收机制的编程语言。

语法简单

就类型和规则而言Go与C99、C11相似之处颇多,因此又被称之为“NextC”。

并发模型

Go从根本上将一切都并行化,运行时使用Goroutine来运行一切,包括 main.main 入口函数。

Goroutine使用协程的方式来处理并发单元,运行时更深度的优化处理,使得并发编程极为简单,无需处理回调,无需关注线程切换。

Go搭配channel实现CSP模型,将并发单元之间的数据耦合拆解以各司其职,这对纠结于内存共享、锁粒度的开发人员是一种解脱。

内存分配

Go将一切并发化带来的问题是如何实现高并发下的内存分配和管理,Go选用 tcmalloc 高性能内存分配组件来解决这个问题。

垃圾回收

由于指针的存在回收内存不能做收缩处理,而Go的指针运算被阻止。

静态链接

Go静态链接只需编译后的可执行文件,无须附加其它即可部署。

标准库

Go标准库中值得称道的是 net/http

工具链

Go无论是编译、格式化、错误检查、帮助文档、第三方包下载与更新都有与之对应的工具。

并发编程

早期CPU都是以单核形式顺序执行机器指令,C正是这种顺序编程语言的代表。顺序编程语言中的顺序指的是:所有指令都是以串行的方式执行,在相同时刻有且仅有一个CPU在顺序执行程序指令。

随着CPU发展单核提升CPU运行效率遇到瓶颈,随后出现多核CPU,相应地编程语言也朝向并行化发展。

Go从底层原生支持并发,无须第三方库。Go的并发基于 goroutine ,goroutine可理解为一种虚拟线程。Go运行时会参与调度goroutine,并将goroutine合理地分配给每个CPU以最大限度地提升CPU性能。

多个goroutine中会使用channel通道进行通信,通道是一种内置的数据结构,让用户在不同goroutine之间发送具有指定类型的消息。因此让编程更倾向于goroutine之间发送消息,而非让多个goroutine争夺同一个数据的使用权。

有疑问加站长微信联系(非本文作者)

eUjI7rn.png!mobile

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK