日了个狗
之所以开始学习Golang,也是因为公司的新项目要求完全用golang来写。日了个狗的,公司全是PHP开发,这样急转弯式的切技术栈不知是福是祸。本打算写完C的笔记,就开始写计算机系统和操作系统,再然后写数据结构和算法,现在看来,得先开始写Golang了。
初识Golang
golang没有类和继承的概念,多态是依靠接口实现。
golang自带编译器,完全支持UTF8。
golang被称为“next C”, 下一代的C语言。例如:保留指针,但默认阻止指针运算,将切片和字典作为内置类型。
golang运行时通过Goroutine来运行所有的一切,包括main.main。它将一切都并发化。
Go语言为并发而生
Go语言的并发是基于 goroutine 的,goroutine 类似于线程,但并非线程(协程)。协程更像是可以在函数间跳转的goto语句,当然,在需要时还能goto回来,这一点更像函数调用
。
可以将 goroutine 理解为一种虚拟线程。Go语言运行时会参与调度 goroutine,并将 goroutine 合理地分配到每个 CPU 中,最大限度地使用CPU性能。
goroutine
M (machine):代表真正的内核OS线程,和POSIX里的thread差不多,真正干活的人。
G (goroutine):代表一个goroutine,它有自己的栈,instruction pointer和其他信息(正在等待的channel等等),用于调度。
P (process):代表调度的上下文,可以把它看做一个局部的调度器,使go代码在一个线程上跑,它是实现从 N: 1 到 N: M 映射的关键。
注意,再次强调,golang的一切都是运行在goroutine上。
channel
channel是go语言内部的一个数据结构。在 Go 语言中,一个最常见的也是经常被人提及的设计模式就是不要通过共享内存的方式进行通信,而是应该通过通信的方式共享内存。
并发模型
Golang的并发模型是CSP模型,也就是不要用共享内存的方式去通信,而是用通信的方式共享内存
这句名言的实践。
通常基于线程的并发模型是这样的:
为了保证线程之间不冲突,需要加锁。也就是
用共享内存的方式去通信
Golang的CSP模型如下:
这种一个消息从Goroutine1到Goroutine2的方式,像极了生产者/消费者通信模型。因此,也就是
用通信的方式去共享内存
有疑问加站长微信联系(非本文作者)