golang工程实践 | 青训营笔记

93 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第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个协程并发执行

image.png

  • 可以看出,加锁可以保证并发安全。

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, 通过它可以开启或关闭模块支持,它有三个可选值:offonauto,默认值是 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 视图层,接收请求,并响应响应的页面数据。