GO语言进阶篇 | 青训营笔记

88 阅读1分钟

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

课堂笔记

一、本堂课重点内容:

  • go语言进阶
  • go语言依赖管理
  • go语言测试
  • go语言项目实战

二、具体案例:

1. go语言进阶

  • 并行与并发

    并发:多线程程序在一个核的cpu上运行

    并行:多线程程序在多个核的cpu上运行

  • Goroutine

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

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

image.png

package main
import (
   "fmt"
   "time"
)
func hello1(i int)  {
   fmt.Println("hello goroutline:" + fmt.Sprint(i))
}
​
func main() {
   for i :=0; i<5 ; i++{
      go func(j int) {
         hello1(j)
      }(i)
   }
   time.Sleep(time.Second)
}
  • CSP

    提倡通过通信共享内存而不是通过共享内存而实现通信

image.png

  • Channel

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

    无缓冲通道:make(chan int)

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

image.png

image.png

  • 并发安全Lock

    使用lock sync.Mutex实现互斥访问

  • WaitGroup

    Add()开启协程+1参数里面填的协程数;

    Done()执行结束-1,完成一次协程数量减一;

    Wait()主协程阻塞直到计数器为0。

image.png

2. go语言依赖管理

2.1 GO依赖管理演进
  • GOPATH

    弊端:无法实现package的多版本控制

  • GO Vendor

    无法控制依赖的版本

    更新项目有可能出现依赖冲突,导致编译出错

  • GO Module

    通过go.mod文件管理依赖包版本

    通过go get/go mod指令工具管理依赖包

2.2 依赖管理三要素

1.配置文件,描述依赖 go.mod

2.中心仓库管理依赖库 Proxy

image.png

3.本地工具 go get/mod

3.项目测试

3.1 回归测试

一般是手动通过终端回归一些固定的主流程场景

3.2 集成测试

对系统功能维度做测试验证

3.3 单元测试

测试开发阶段,开发者对单独的函数、模块做功能验证

  • 规则:所有测试文件以_test.go结尾

    func TestXxx(*testing.T)

    初始化逻辑放到TestMain中

  • 覆盖率:用来衡量项目的测试水准及等级,具体就是测试对应函数,其中函数里执行的代码行数除以总代码的行数,assert.Equal会自动计算

  • Mock函数

4.go语言项目实战

4.1 需求描述(社区话题页面)
  • 展示话题(标题,文字描述))和回帖列表
  • 暂不考虑前端页面实现,仅仅实现一个本地web服务
  • 话题和回帖数据用文件存储
4.2 需求用例
  • 浏览消费用户

    image.png

4.3 E-R图
  • 话题
  • 帖子

image.png

4.4 分层结构
  • 数据层:数据Model,外部数据的增删改查

  • 逻辑层:业务Entity,处理核心业务逻辑输出

  • 视图层:视图view,处理和外部的交互逻辑

    image.png

4.5 组件工具
  • Gin高性能go web框架
  • Go Mod
4.6 项目代码及结果

项目get请求结果

image.png

三、课后个人总结

今天直接进入了项目的基础架构,对项目测试理解更加透彻了,讲了很多关于go语言性能上面的优点,以及自我感觉很好,期待后期课程