Go语言初探 | 青训营笔记

61 阅读2分钟

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

Go Language


语言特性

  • 高性能、高并发
  • 丰富的标准库
  • 完善的工具链
  • 所有编译结构静态链接,部署方便快捷
  • 快速编译
  • 跨平台
  • 垃圾回收

基本语法

var xxx type 定义变量
xxx := abc 定义局部变量并初始化
if 后无括号
可以在 case xxx: 里写条件分支
切片:

s := make([]string, 2)
s[0] = "a"
s[1] = "b"
s = append(s, "d")
c := make([]string, len(s))
copy(c, s)

map: m := make(map[string]int)

在函数返回值中添加 err error 传递错误信息



GO 并发&协程

并发:多个线程在单核上运行(时间切片)
并行:多个线程直接在多核上运行
Go语言能够充分发挥多核优势,更适合高并发场景

协程:用户态
线程:内核态(更消耗 系统资源) 可以并发地运行多个协程

在函数调用前添加 go 关键字,创建协程运行

协程间提倡 通过通信共享内存 (通道)
make(chan 类型, [大小])
带缓冲的channel 可以解决生成和消费速度不平衡的问题

共享内存 存在多个goroutine同时操作一块内存的情况
sync.Mutex

sync.WaitGroup 协程间同步(实现阻塞)
内部维护一个计数器 提供AddDoneWait三个方法

func ManyGoWait() {
	var wg sync.WaitGroup
	wg.Add(5) // 计数器增加delta  Add(delta int)
	for i := 0; i < 5; i++ {
		go func(j int) {
			defer wg.Done() // 计数器减1
			hello(j)
		}(i)
	}
	wg.Wait() // 阻塞至计数器为0
}


GO 依赖管理

不同环境(项目)依赖库的版本不同,如何控制依赖库的版本?
GOPATH -> Go Vendor -> Go Module

GOPATH: go语言的环境变量(工作区)
bin: 项目编译的二进制文件
pkg: 项目编译的中间产物,加速编译
src: 项目编译的源码(项目代码直接依赖于src下的源码)
问题:无法实现package的多版本控制

Go Vendor: 项目目录下增加vendor文件,所有依赖包以副本存放在 $ProjectRoot/vendor 下
问题:无法控制依赖的版本(直接依赖源码 不能标识版本)

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

  • 配置文件,描述依赖:go.mod
  • 中心仓库管理依赖库(缓存、依赖分发):Proxy(从Proxy中获取依赖)
  • 本地工具:go get/mod

Proxy 保证了依赖的稳定性(相对于直接从第三方代码平台)
需要配置 GOPROXY环境变量

go mod 指令:

  • init:初始化 创建go.mod文件
  • download:下载模块到本地缓存
  • tidy:增加需要的依赖,删除不需要的依赖