这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
课堂笔记
- 本堂课的知识要点有哪些?
1.Goroutine
2.Channel
3.并发安全:锁
4.Go Module
5.gin框架
- 本堂课介绍了哪些知识点?
(1)Goroutine
协程:用户态,轻量级线程,栈MB级别.
线程:内核态,线程跑多个协程,栈KB级别.
在Golang中,使用go关键字来开一个协程,例如下面的例子
func hello(i int) {
fmt.Println(i)
}
func main() {
for i := 0; i < 5; i++ {
go func(j int) {
hello(j)
}(i)
}
time.Sleep(time.Second)
}
输出结果是
2
1
3
4
0
Go提倡通过通信共享内存而非通过内存实现通信
后者会导致race问题,造成资源浪费
(二)Channel
初始化无缓冲通道和有缓冲通道
hello1 := make(chan string)
hello2 := make(chan string,2)
无缓冲通道hello1又称为同步通道,是即时的资源交换,若放值和取值的时刻不是同时进行会被阻塞,在生产者的效率方面这并不好
而有缓冲通道hello2可以临时储存,可以不同时进行放值和取值
(三)并发安全
使用sync库的锁
var Lock sync.Mutex
Lock.Lock()//加锁
Lock.Unlock()//解锁
在一个协程操作资源时会加锁,导致其他协程必须等待unlock才能继续操作资源,防止race问题
优雅的阻塞---WaitGroup
var wg sync.WaitGroup
wg.Add(5)
wg.Done(1)
wg.Wait()
wg.Add(5):增加5个任务点
wg.Done(1):减去一个任务点
wg.Wait():阻塞 等到任务点全部完成
(四)依赖
1.GOPATH
bin:项目编译的二进制文件
pkg:项目编译的中间产物,加速编译
src:项目源码
弊端:无法实现多版本的控制
2.Go Module
go.mod :配置文本描述依赖
Proxy :中心仓库管理依赖库
go get/mod :本地工具
go mod init//初始化go.mod
go mod download//下载模块到缓存
go mod tidy//增加需要的依赖,删除不需要的依赖
- 有什么实践举例帮助理解知识点?
1.开启五个goroutine每个协程是让i++,初始i为0
不在对i加锁的步骤上下加锁结果值可能小于10000
而对i加锁
lock.Lock()
i++
lock.Unlock()
结果就一定是10000
2.gin框架
web框架 - Gin
分层结构设计
文件操作 - 读文件
数据查询 - 索引
在Router接口层
r:=gin.Default()
r.GET(...)
r.Run()
快速起一个http服务
- 本章有什么知识点不容易掌握?
Goroutine,Channel作为Go语言的一大特色,其高并发和带来的安全问题是一大难点,而且锁也有读写锁,互斥锁等等,熟悉通道的使用以及其在不同协程之间的资源交换是不容易掌握的,需要非常多的开发经验和理论基础...
gin框架中的上下文和一些方法需要重点使用和理解,如ShouldBind,Set等等,需要不断开发积累起来经验才可以学懂,同时还要具备一定量的计算机网络知识