这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记
一、重点内容:
- 并发编程
- 依赖管理
- 测试
- 项目实战
二、并发编程
1.并发vs并行
- 并发:多线程程序在一个核的cpu上运行
- 并行:多线程程序在多个核的cpu上运行
GO可以充分发挥多核优势,高效运行。
2.Goroutine
- 协程:用户态,轻量级线程,栈MB级别。
- 线程:内核态,线程跑多个协程,栈KB级别。
3.Channel
- 语法:
- make(chan 元素类型, 缓冲大小)
- 无缓冲通道 make(chan int)
- 有缓冲通道 make(chan int, 2)
4.并发安全Lock
- 案例:
- 对变量执行2000次+1操作,5个协程并发执行
- 可以看出,加锁可以保证并发安全。
5.WaitGroup
- 案例:
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup
func hello(i int) {
defer wg.Done() // goroutine结束就登记 -1
fmt.Println("Hello Goroutine!", i)
}
func main() {
for i := 0; i < 10; i++ {
wg.Add(1) // 启动一个goroutine就登记 +1
go hello(i)
}
wg.Wait() // 等待所有登记的goroutine都结束
}
三、依赖管理
1.go mudule
go module 是Go1.11版本之后官方推出的版本管理工具,并且从Go1.13开始, go module 将是Go语言默认的依赖管理工具。
2.简单使用
要启用 go module 支持首先要设置环境变量 GO111MODULE, 通过它可以开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是 auto。
COPY 1. `GO111MODULE=off` 禁用模块支持,编译时会从`GOPATH` 和 `vendor` 文件夹中查找包。
2. `GO111MODULE=on` 启用模块支持,编译时会忽略`GOPATH` 和 `vendor` 文件夹,只根据 `go.mod` 下载依赖。
3. `GO111MODULE=auto`,当项目在 `$GOPATH/src` 外且项目根目录有 `go.mod` 文件时,开启模块支持。
简单来说,设置 GO111MODULE=on 之后就可以使用 go module 了,以后就没有必要在 GOPATH 中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。
3.go mod 命令
常用的 go mod 命令如下:
go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
go mod edit 编辑go.mod文件
go mod graph 打印模块依赖图
go mod init 初始化当前文件夹,创建go.mod文件
go mod tidy 增加缺少的module,删除无用的module
go mod vendor 将依赖复制到vendor下
go mod verify 校验依赖
go mod why 解释为什么需要依赖
四、测试
1.单元测试
- 规则:
- 所有测试文件以
_test.go结尾 func TestXxx(*testing.T)- 初始化逻辑放到 TestMain 中
五、青训营首页练习
1.项目结构
project __ main.go
|__ controller
|__ repository
|__ service
|__ data
|__ go.mod
|__ go.sum
2.主要思想
- repository 数据层,进行连接DB操作,拿post和topic数据
- service 逻辑层,将拿到的数据封装成一个页面
- controller 视图层,接收请求,并响应响应的页面数据。