go的进阶及实践 l 青训营笔记

71 阅读2分钟

这是我参与「第五届青训营」伴学笔记创作活动的第 2 天

1.1 Goroutine

协程:用户态,轻量级线程,栈mb级别

线程:内核态,线程跑多个协程,栈kb级别

实现快速需要打开多个协程如go func(j int)在函数前面加go

1.2CSP

通过通信共享内存

1.3Channel

make(chan 元素类型,[缓冲大小])

例:

  • 无缓冲通道 make(chan int) //同步通道

  • 有缓冲通道 make(chan int, 2) //容量为2的缓冲通道

	src := make(chan int)
	dest :=make(chan int, 3)//缓冲通道为3
	go func() {
		defer ckose(src)
		for i := 0; i < 10; i++ {
			src = i //记录小于十的数字
		}
	}()
	go func(){
		defer close(dest)
		for i := range src {
			dest = i * i //记录平方
		}
	}()
	for i := range dest {
		//所有复杂其他数
		println(i)
	}

1.4并发安全Lock

避免对共享内存进行非法操作

1.5WaitGroup

Add(delta int)      //计数器+delta
Done()    //计数器-1
Wait()    //阻塞知道计数器为0
	var wg sync.WaitGroup
	wq.Add( delta: 5)
	for i := 0; i < 5; i++b {
		go func(j int){
			defer wg.Done()
			hello(j)
		}(i)
		}
		wg.Wait()
}

1.小结

  • Goroutine
  • Channel
  • Sync

1.协程 使用go实现高并发的一个操作

2.通过 go实现共享内存

3.学习一些关键字实现操作

2.依赖管理

2.1 Go 依赖管理演进

共有三个阶段

  1. GOPATH
  2. GO Vendor
  3. Go Module(广泛应用)

2.1.1 GOPATH

工作区

bin 项目编译的二进制文件

pkg 项目编译的中间产物,加速编译

src 项目原码(直接依赖)

弊端:无法实现多版本控制

2.1.2 Go Vendor

增加了vendor文件,通过引入依赖文件,解决多项目使用同一个package的冲突问题

弊端:

1.无法控制依赖版本

2.更新项目有可能出现冲突

2.1.3 Go Module

通过go.mod文件管理 实现定义版本规则和管理项目依赖关系

三要素

  1. 配置文件,描述依赖 go.mod
  2. 中心仓库管理依赖库 Proxy
  3. 本地工具 go get/mod