GO入门学习遇到的一些小贴士,给自己当note
学习资料:https://www.liwenzhou.com/posts/Go/go_menu/
并发
并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天)
并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天)
goroutine
两个例子
1.basic
1 | package main |
2.闭包
1 | package main |
GOMAXPROCS
1 | package main |
channel
单纯地将函数并发执行是没有意义的。函数与函数间需要交换数据才能体现并发执行函数的意义
如果说goroutine
是Go程序并发的执行体,channel
就是它们之间的连接。channel
是可以让一个goroutine
发送特定值到另一个goroutine
的通信机制。
Go 语言中的通道(channel)是一种特殊的类型。通道像一个传送带或者队列,总是遵循先入先出(First In First Out)的规则,保证收发数据的顺序。每一个通道都是一个具体类型的导管,也就是声明channel的时候需要为其指定元素类型。
1.basic
1 | package main |
2.channel + goroutine
1 | package main |
worker pool(goroutine池)
三个goroutine解决五个任务也可以的哦
控制goroutine
的数量,防止goroutine
泄漏和暴涨
1 | package main |
select多路复用
好处就是可以处理多个channel,哪个channel的收发存在信息,就去处理,灵活多变
1 | func main() { |
结果是随机的,因为执行的语句也是随机的
并发安全和锁
熟悉操作系统的同学懂得都懂
互斥锁
1 | package main |
读写互斥锁
其实没啥东西,不需要我们设计底层,直接调用方法就好了
直接放上学习资料里面的例子
1 | var ( |
sync.Once
在编程的很多场景下我们需要确保某些操作在高并发的场景下只执行一次,例如只加载一次配置文件、只关闭一次通道等
sync.Map
Go语言中内置的map不是并发安全的,要加锁
1.可以自己加锁实现
2.也可以使用GO语言内置的功能sync.Map
sync.Map
内置了诸如Store
、Load
、LoadOrStore
、Delete
、Range
等操作方法
1 | package main |
本文链接: http://woaixiaoyuyu.github.io/2020/02/29/GO-note3-%E5%B9%B6%E5%8F%91/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!