Go语言进阶 | 青训营笔记

50 阅读1分钟

发现有一些Go语言进阶的知识比如读写锁,协程之类的知识点没有做笔记,要用到的时候又得重新查资料,所以今天来补一下相关的内容记录。

1.协程

  • 主死从随:指主程序结束后协程也会直接结束,所以要启动waitGroup来让main函数在协程返回后才结束。
import "sync" //包含waitGroup的包
var wg sync.WaitGroup
  • 启动一个协程
wg.Add(1)
go func(){
    //进行操作...
    wg.Done()
}
wg.Wait() //会等待协程done之后才停止阻塞

2. 管道

  1. 管道的声明和定义
var intChan chan int 
intChan = make(chan int, 3) //可以存放3个int数据
  1. 向管道中存放数据
intChan <- 10
num := 20
intChan <- num

注意不能存放超过管道容量的数据个数,否则会报错 3. 向管道读取数据

num := <- intChan

注意:如果管道中的数据已经全部取出,那么再次取出时会报错 4. 管道的关闭

管道一旦关闭,就只能向其中读出数据而不能写入数据。

close(intChan)
  1. 管道的遍历
  • 遍历时管道应该关闭,否则就会一直读取,然后报错
  1. select功能

注意:从管道中取数据本身就有阻塞效果

select {
    case v := <- intChan:
        fmt.Println(v)
    case v := <- stringChan:
        fmt.Println(v)
    default:
        ...
}

上面中是哪个case先停止阻塞取到数据了就先执行哪个case的操作,而default是防止select永远不选择,一直处于被阻塞的状态。

3.context

参考文章:深入理解Golang之context (zhihu.com)

  1. 创建一个可取消的子context
ctx, cancel := context.WithCancel(context.Background())

// 注意所有的contxt都需要有这一步
defer cancel()
  1. 在context中设置键值对
ctx := context.WithValue(context.Background(), key, value)

// 获取
v := ctx.Value(key)