Go开发工程实践 | 青训营笔记

178 阅读2分钟

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

本节课程从工程实践的角度,了解Go开发的知识点。

主要内容:

  1. 语言进阶:从并发编程的时角了解Go高性能本质
  2. 依赖管理:了解Go语言依赖管理的演进路线
  3. 测试:从单元测试实践出发,提升质量意识
  4. 项目实战

并发VS并行

Go可以充分发挥多核优势

协程线程

  • 协程:用户态,轻量级线程,栈MB级别

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

1.1 Goroutine

goroutine是Go并行设计的核心。goroutine说到底其实就是协程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,Go语言内部帮你实现了这些goroutine之间的内存共享。

1.2 CSP (Communicating Sequential Processes)

提倡通过通信共享内存(通道通信)而不是通过共享内存(各个Gorountine用一个领界区)而实现通信

1.3 Channel

一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发送值信息。

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

例子:

// 保证并发安全输出平方数
func CalSquare() {
	src := make(chan int)
	dest := make(chan int, 3)
	go func() {
		defer close(src)
		for i:= 0; i < 10; i++ {
			src <- i
		}
	}()
	go func() {
		defer close(dest)
		for i := range src {
			dest <- i * i
		}
	}()
	for i := range dest {
		println(i)
	}
}

1.4 并发安全 Lock

加锁lock sync.Mutex实现并发安全

2 依赖

govendor 是 GoLang 常用的一个第三方包管理工具,它的出现解决了不同用户在 clone 同一个项目时从外部获取不同依赖库版本的问题。

从 Go1.11 开始, Go 官方加入 Go Module 支持, Go1.12 成为默认支持; 从此告别源码必须放在 Gopath 中 以及 Gopath 对初学者造成的困扰.

执行go mod vendor命令,会将下载至 GOPATH 下的依赖转移至该项目根目录下的 vendor(自动新建) 文件夹下, 此时我们就可以使用这些依赖了

项目编译时会选择最低的兼容版本(而不是编译多个选择的版本)

go mod init  # 初始化 go.mod
go mod tidy  # 更新依赖文件(增加需要的依赖,删除不需要的依赖)
go mod download  # 下载依赖文件到本地
go mod vendor  # 将依赖转移至本地的 vendor 文件
go mod edit  # 手动修改依赖文件
go mod graph  # 打印依赖图
go mod verify  # 校验依赖

3 测试

学习了单元测试和基准测试相关包和操作

4 社区话题页面项目实战