Go语言进阶与依赖管理 | 青训营笔记

120 阅读2分钟

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

一、本堂课重点内容:

1、语言进阶

2、依赖管理

3、测试

4、项目实战

二、详细知识点介绍:

01、并发vs并行:

多线程程序在一个核的cpu上运行

多线程程序在多个核的cou上运行

go可以充分发挥优势,高效运行

1.1 Goroutine:

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

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

func hello(i int){
    println("hello goroutine:"+fmt.Sprint(i))
}
func HelloGoRoutine(){
    for i:=0;i<5;i++{
        go func(j int){
            hello(j)
        }(i)
    }
    time.Sleep(time.Second)
}

1.2 CSP

go 提倡通过通信共享内存而不是通过共享内存而实现通信。

通过通信共享内存通过通道实现,通过共享内存而实现通信通过临界区实现。

1.3 Channel

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

无缓冲通道 make(chan int)会使发送的和接受的goroutine同步化。

有缓冲通道 make(chan int,2)2指容量,代表了通道中能存放多少元素。

例如:在子协程发送0-9数字,并在子协程计算输入数字的平方。主协程输出最后的平方数。

1.4并发安全 Lock

不加锁会输出未知结果

1.5 WaitGroup

Add(date int) 计数器+delta

Down() 计数器-1

Wait () 阻塞直到计数器为0

计数器:开启协程+1;执行结束-1;主协程阻塞直到计数器为0。

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

02 依赖管理

2.1.1GOPATH

bin项目编译的二进制文件

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

src项目源码,项目代码直接依赖src下的代码

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

2.1.2Go Vendor

项目目录下增加vendor文件,通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package 依赖的冲突问题。 弊端:无法控制依赖的版本,更新项目又可能出现依赖冲突,导致编译错误。

2.1.3GO Module

通过 go.mod文件管理依赖包版本

通过 go get/go mod 指令工具依赖包

终极目标:定义版本规则和管理项目依赖关系

2.2依赖管理三要素

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

2.中心仓库管理依赖库 Proxy

3.本地工具 go get/mod

三、实践练习例子:

根据青训营话题和回帖的项目实践了解有关项目的流程,为后期做项目打下基础。

四、课后个人总结:

本节内容重在理解其中的概念,理解相关术语。