Day 2 go |青训营笔记

103 阅读2分钟

Day 2|青训营笔记

一,本堂课重点内容:

channel(通道)

前缀go创造一个协程

并发安全lock

sync

GOPATH-弊端

Go Vender

Go Module

依赖分发

依赖配置

工具

二,详细知识点介绍:

version

屏幕截图 2023-01-17 000240.png csp

通过通信共享内存

通过共享内存实现通信

channel(通道)

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

无缓冲通道 (同步通道) 例:make(chan int)

无缓冲通道(超过容量通道阻塞) 例:make(chan int,2)

屏幕截图 2023-01-17 102604.png

并发安全lock

多协程并发执行无锁可能会输出错误需要加锁

通过lock与unlock使用临界内存并释放内存

实践练习例子

package main

import (
	"sync"
	"time"
)

var (
	x    int64
	lock sync.Mutex
)

func havelock() {
	for i := 0; i < 2000; i++ {
		lock.Lock()
		x += 1
		lock.Unlock()
	}
}
func withoutlock() {
	for i := 0; i < 2000; i++ {

		x += 1

	}
}
func main() {
	x = 0
	for i := 0; i < 500; i++ {
		go havelock()
	}
	time.Sleep(time.Second)
	println(x)
	x = 0
	for i := 0; i < 500; i++ {
		go withoutlock()
	}
	time.Sleep(time.Second)
	println(x)

}

屏幕截图 2023-01-17 104549.png

WaitGroup

内部是一个计数器

屏幕截图 2023-01-17 105025.png

for goroutine 中的执行顺序是 无序的

package main

import "sync"

func hello(i int) {
	println(i)
}

func main() {
	var wg sync.WaitGroup
	wg.Add(5)
	for i := 0; i < 5; i++ {
		go func(j int) {
			defer wg.Done()
			hello(j)
		}(i)
	}
	wg.Wait()
}

解释for与go变量名不同 把传进goroutine的变量范围变成goroutine之内

否则当主进程结束是协程还未结束无法输出协程内容 (参考segmentfault.com/a/119000004…)

for goroutine 中的执行顺序是 无序的

sync包主要是协程的操作以及并发安全管理

依赖管理

GOPATH-弊端

当两个项目依赖于某一package的不同版本无法实现package的多版本控制

Go Vender

屏幕截图 2023-01-17 123858.png

依赖寻址方式:vendor-->GOPATH

**通过给每个项目引入一份依赖的副本,**使得多个项目需要同一个包的依赖冲突问题得到解决。

弊端

无法控制依赖的版本并且如果项目进行更新会导致编译错误。

Go Module

依赖管理三要素:

一,配置文件描述依赖 go.mod

屏幕截图 2023-01-17 124959.png

二,中心仓库管理依赖库 Proxy

三,本地工具 go get/mod

依赖配置

version

屏幕截图 2023-01-17 125322.png

语义化版本
  1. 不同的major版本表示不兼容的 API
  2. MINOR新增函数或功能向后兼容
  3. PATCH修改bug
基于commit伪版本。

基础版本 + 时间戳 + 校验码 (效验码由12位的哈希数字构成)

indirect

A->B->C

A->B A直接依赖于B。

A->C A间接依赖于C。

当一个项目依赖于其他多个项目,并且其他的多个项目也依赖于C项目的2个版本。那么最终编译时会选择C项目的最低兼容版本。

依赖分发

回源

缺点较多无法保证构建的稳定性,可用性。

Proxy

他是一个站点,会缓存站中的软件内容,构建时直接从站点拉取依赖。

稳定可靠。

工具

go get

屏幕截图 2023-01-17 130758.png

go mod

屏幕截图 2023-01-17 130846.png

四、课后个人总结

加强对go mod的使用

五、引用参考:

segmentfault.com/a/119000004…

bytedance.feishu.cn/file/boxcnp…