这是我参与「第五届青训营」伴学笔记创作活动的第2天 一、本堂课重点内容:GO语言进阶与依赖管理 二、关于本堂课的知识点
- 本章内容首先向我们介绍了Go语言运行为何能够如此之快 从多线程程序运行的角度来看,其实并发指的是多线程在一个CPU上的运算,它主要是通过替换来实现同时运行的一个状态。而并行则是直接利用多核实现多线程的同时运行。广义的并发其实可以理解成是系统对外的一个特征或者能力,比如大家出去面试,都会说自己参加某某某个高并发的一个项目,这里的并发就是广义的。在实际中并行其实可以理解成实现并发的一个手段,而go语言的优点是实现了变化性能极高的一个调度模型,然后通过高效的调度,可以最大限度的利用计算资源,充分发挥多核计算机的一个优势,可以说Go语言就是为并发而生的。 2、Go语言中有协程 协程:用户态,轻量级现成,栈MB级别。 线程:内核态,线程跑多个协程,栈KB级别。 Go语言开启协程示例:
- package main
- import (
- "fmt"
- "sync"
- )
- var wg sync.WaitGroup
- func Hello(i int) {
- defer wg.Done() // 减少WaitGroup计数器的值,应在线程的最后执行。
- fmt.Println("Hello Goroutine!", i)
- }
- func main() {
- for i := 0; i < 10; i++ {
- wg.Add(1) // 向协程计数器加1。
- go Hello(i)
- }
- wg.Wait() // 阻塞协程,直到协程计数器为0。
- fmt.Println("所有的协程已经结束了,主线程可以结束了。")
- }
3、Go语言协程中的Channel 例如A子协程发送0-9数字 B子协程计算输入数字的平方 主协程输出最后的平方数 Go创造Channel
func goRoutineA(a <-chan int) { val := <-a fmt.Println("goRoutineA received the data", val) } func main() { ch := make(chan int) go goRoutineA(ch) time.Sleep(time.Second * 1) }