golang基础:并发与依赖管理 | 青训营笔记

153 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第2篇笔记

GO并发编程

GO有两种并发编程的风格。

  • groutine(协程)和通道。 他们支持通信顺序进程(Communicating Sequential Process,CSP),CSP是一种并发模式,在不同的执行体(goroutine)之间传递值,但是变量本身局限于单一的执行体。
  • 共享内存多线程的传统模型。 go语言提倡通信共享内存而不是通过共享内存而实现通信

通道分为有缓冲通道和无缓冲通道:

  • 无缓冲通道 需要同步操作,即在无缓冲通道上发送操作将会阻塞,知道另一个goroutime在对应的通道上执行接收操作。

    无缓冲通道 通过 ch := make(chan int) 创建

    func TestTeName(t *testing.T) {
        naturals := make(chan int)
        squares := make(chan int)
        //管道的返回值为(bool, type)
        go func() {
            for x := 0; x < 10; x++ {
                naturals <- x
            }
            close(naturals)
        }()
    ​
        go func() {
            for x := range naturals {
                squares <- x * x
            }
            close(squares)
        }()
    ​
        for x := range squares {
            fmt.Println(x)
        }
    }
    
  • 缓冲通道 发送方直接将数据发送到通道中,只有当缓冲通道满了的时候才会阻塞 ch := make(chan int, 4)

管道的使用

  • 发送语句。 ch <- x
  • 接收表达式。 x = <-ch

GO依赖管理

GOPATH

GOPATHgo get的依赖包全都下载到

image-20220508183140658

go get下载最新版本的包到src目录下

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

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

GO Vendor

在项目目录下增加vendor文件,将所有依赖包以副本的形式存入项目路径下的vendor目录,解决了多个项目需要同一个package依赖的冲突问题

存在的弊端:当一个项目下依赖的包同时依赖于另一个不同版本的包时,会发生冲突(传递依赖)

GO Module

GO Module 通过go.mod配置文件来管理依赖,类似于maven下的pom文件,通过go.modrequire需要的包以及版本号,具体的包存放在GOPATH中的pkg目录下,类似maven仓库。

go.mod下的依赖包版本号:

  • 语义化版本: ${MAJOR}.${MINOR}.${PATCH} 如:1.2.0 (直接依赖)
  • 基于commit伪版本 :Vx.0.0-yyyymmddhhmmss-abcdefgh1235 版本号-年月日时分秒-校验码 (间接依赖)

\