这是我参与「第五届青训营 」笔记创作活动的第2天 课程讲解内容:这节课程主要分为四个方面:并发编程 依赖管理 单元测试 项目实战 并发编程讲解了:协程Goroutine 通道Channel 锁Lock 线程同步WaitGroup 依赖管理讲解了:Gopath Go Vendor Go Module 1.并发与并行: 并发:多个代码片段(进程、线程)轮流在一个物理处理器(单核 CPU)上执行,通过快速的上下文切换,营造一种同时执行的假象,是虚假的同时执行。 并行:多个代码片段(进程、线程)同时在不同的物理执行器上执行,是真正的同时执行。 2.进程 线程 协程 进程:一个正在运行的程序,系统进行资源分配的基本单位,拥有独立的内存空间。 线程:系统调度的基本单位,每个进程可以有一个到多个线程(进程的初始线程为主线程),线程有自己的寄存器和栈空间等,但也共享着进程的内存空间。这里的线程指内核级线程。 协程:一种用户态的轻量级线程,协程的调度完全由用户控制,没有内核的开销。类似于用户级线程。 3.Goroutine:goroutine 是 Go 语言并发的关键部分,它是 Go 语言中的轻量级线程,也可以叫做用户级线程/协程。它是 Go 语言中的多线程。 在 Go 语言中,创建并启动 goroutine 十分便捷,只需使用 go 关键字调用一个函数即可。如下,调用匿名函数启动一个 Goroutine go func() { fmt.Println("hello goroutine") }() 4.Channel:channel 是 Go 语言中的引用类型结构,声明后初值为 nil。 5.无缓冲通道 无缓冲通道,是指通道中不能缓存数据。换句话说,发送方接收方必须都进入通道,才能完成数据传输,不然一方必须等待另一方。 发送方发送数据时,如果接收方还没准备好,则发送方会阻塞等待接收方;接收方准备好接收数据时,如果发送方还没来,则接受方也会阻塞。 6.有缓冲通道,是指通道中能缓存数据。 那么,通道并不要求双方必须同时完成发送和接受,发送方把数据放到通道中就可以离开,接收方从通道中拿到数据也可以离开。 但是,当通道中没有多余空间时,发送方需要阻塞;当通道中没有缓存数据时,接收方需要阻塞。