[ 后端与 Go语言 | 青训营笔记]

46 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天

今天从工程实践角度,学习企业项目实际开发过程中的所遇的难题, Go 语言的进阶之路,以及在其依赖管理管理过程中的演进。除此之外,还学习了 Go 在测试环节的相关内容,单元测试、Mock 测试和基准测试三个方面。

Go语言中的并发程序可以用两种手段来实现,goroutine和channel,其支持“顺序通信进程”(communicating sequential processes)或被简称为CSP。

在Go语言中,每一个并发的执行单元叫作一个goroutine,goroutine 是一种非常轻量级的实现,可在单个进程里执行成千上万的并发任务,它是Go语言并发设计的核心。goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。Go 程序从 main 包的 main() 函数开始,在程序启动时,Go 程序就会为 main() 函数创建一个默认的 goroutine。

如果说goroutine是Go语言程序的并发体的话,那么channels则是它们之间的通信机制。一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。每个channel都有一个特殊的类型,也就是channels可发送数据的类型。一个可以发送int类型数据的channel一般写为chan int。channel 是进程内的通信方式,因此通过 channel 传递对象的过程和调用函数时的参数传递行为比较一致,比如也可以传递指针等。如果需要跨进程通信,建议用分布式系统的方法来解决,比如使用 Socket 或者 HTTP 等通信协议。Go语言对于网络方面也有非常完善的支持。

协程:独立的栈空间,共享堆空间,调度由用户自己控制,本质上有点类似于用户级线程,这些用户级线程的调度也是自己实现的。

线程:一个线程上可以跑多个协程,协程是轻量级的线程。