Go语言进阶 | 青训营笔记

52 阅读2分钟

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

重点内容

  1. 语言进阶 从并发编程的视角了解Go高性能的本质
  2. 依赖管理 了解依赖管理的演进路线
  3. 测试
  4. 项目实战 通过项目需求、需求拆解、逻辑设计、代码实现感受真实开发

详细知识点

并发和并行

**并发: **多线程程序在单核cpu上运行 **并行: **多线程程序在多核cpu上运行

Goroutine

**协程: **用户态,轻量级线程,栈KB级别 **线程: **内核态,线程跑多个协程,栈MB级别 go能跑上万个协程

创建协程:在函数前加 go 关键字

CSP(协程间通信)

提倡通过通信共享内存而不是通过共享内存实现通信 前者需要通道,后者需要获取临界区权限,容易发生数据静态,影响性能

Channel

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

make(chan int)      //无缓冲通道
make(chan int,2)    //有缓冲通道

无缓冲:发送的Gorountine和接受的Gorountine同步化,也被称为同步通道

有缓冲:可以解决同步问题,通道中缓冲满了发送方无法再发送,直到缓冲有空间

func CalSquare(){
    src := make(chan )
}

并发安全Lock

不加锁可能导致不同进程操作同一块内存,通过Sync完成

依赖管理

三要素:

  1. 配置文件,描述依赖 go.mod (类似于CMAKE、makefile?)
  2. 中心仓库管理依赖库 Proxy
  3. 本地工具 go get/mod

go.mod

Proxy

优点:稳定可靠

GOPROXY=”proxy1.cn,https://proxy2.cn,…“ ”“内为服务站点url列表,direct表示源站 按顺序

go get/mod

命令go get example.org/pkg

  1. @update 默认添加
  2. @none 删除依赖
  3. @v1.1.2 tag版本,语义版本
  4. @23dfdd5 特定的commit
  5. @master 分支最新的commit

GOPATH(不重要)

·环境变量 $GOPATH ·项目代码直接依赖src ·go get 下载最新版本的包到src目录下

若A、B两个项目依赖于某一pkg的不同版本:无法实现pkg的多版本控制

Go Vendor

Go Module

· 通过go.mod文件管理依赖包版本 · 通过go get/go mod指令工具管理依赖包