这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
- 1 go中特有的groutine与Thread对比
- groutine是内核态,一个Thread可以运行多个groutine,是栈上的KB
- Thread是用户态,栈MB
- 在go中可以通过go 函数 实现一个协程
- go func(){
-
fmt.Println("hello") - }
- go 是通过CSP即通信实现共享内存
- chan分为无缓冲的make(chan int)和有缓冲的make(chan int, 3)
- 在chan中可以进行输入和取出数据,实现内存共享
- ch1 := make(chan int)
- ch2 := make(chan int, 3)
- go func(){
-
for i:=0; i<5; i++{ -
ch1 <- i -
} - }
- go func(){
-
for j := range ch1 -
ch2 <- j - }
- 这样子可以实现相关共享
- 安全性 锁lock 和 线程池sync.waitGroup
- 可以通过sync.Lock 和sync,Unlock对临界共享资源进行权限控制,但存在加锁流程,效率不高
- var wg sync.WaitGroup
- wg.Add(n)预先分配线程池
- wg.Done()在运行一个groutine之后n-1
- wg.wait()表示当n==0时,所有的groutine运行完成
func hello() {
wg.Add(5)
for i := 0; i < 5; i++ {
go func(j int) {
defer wg.Done()
fmt.Println(j)
}(i + 1)
}
wg.Wait()
}
- go 项目的依赖包
- 配置文件,本地函数相关依赖 go.mod
- 中心仓库代理获取网络相关资源包 Proxy
- 本地工具下载相关依赖包 go get
- go mod inie 初始化,创建go.mod文件
- go mod downland 下载模板到本地
- go mod tidy 增加需要的依赖,删除不需要的依赖
- go项目测试
- 单元测试、Mock测试、基准测试
- 单元测试主要是对相关接口、函数、模块的测试,
- 测试文件_test.go结尾,测试函数Testxxx开头
func TestHello(t *testing.T){
a := 待测试函数返回值
b := 预期输出值
assert.Equal(t,b,a)进行判断
}
- Mock测试主要是对函数或者method进行打桩
- 基准测试:
- 基准测试是指一段程序的运行性能和耗费CPU的程度