Go语言进阶 | 青训营笔记

168 阅读2分钟

Go语言进阶

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

语言进阶

  • Go语言很快,why?

    • 并行:多线程程序在多个核CPU上运行
    • 并发:多线程程序在单个核CPU上运行
    • Go语言能充分发挥多核的优势
  • 例子,快速打印出 hello goroutin:0 - hello goroutin:4

     package day2
     ​
     import (
        "fmt"
        "time"
     )
     ​
     func hello(i int) {
        fmt.Println("hello goroutine : ", i)
     }
     ​
     func HellGoRoutine() {
        for i := 0; i < 5; i++ {
           go func(j int) {
              hello(j)
           }(i)
        }
        time.Sleep(time.Second)
     }
    

    代码并不是按照1 - 5的顺序逐个输出的,而是随机跳动的,说明程序是并行运行的

  • Go语言提倡通过通信来共享内存,而不是通过共享内存来实现通信

  • 通道

    • make(chan, int) 无缓冲通道,make(chan int, 2) 有缓冲通道
    • 涉及操作系统中生产者消费者模型
  • 并发安全

    • 数据冲突
    • lock sync.Mutex 互斥锁来保护临界区

依赖管理

  • 三要素

    • 配置文件,描述依赖, go.mod文件
    • 中心仓库管理依赖,Proxy代理
    • 本地工具,go get/mod
  • 项目不可能通过标准库来从零到一实现搭建

  • 需要管理依赖库

  • 已经存在的

    • GOPATH,不足是无法实现package的多版本控制

    • GO Vendor,不足:

      • 无法控制依赖版本
      • 更新项目可能有依赖冲突
    • GO Module:通过go.mod文件来管理依赖包的版本,类似于Java中的pom

  • 依赖版本选择,会选择一个最低的兼容版本,也就是,在项目能运行的基础上,最低的一个版本

  • go mod工具

    • go mod init 初始化
    • download 下载模块到本地
    • tidy 增加所需要的依赖,删除不需要的依赖

测试

  • 质量就是生命

  • 测试就是保证质量的手段,尽可能的避免事故

  • 大致的三种类型,从上到下,覆盖逐渐变大,成本逐渐变低

    • 回归测试
    • 集成测试
    • 单元测试
  • 规则

    • 所有测试文件,以_test.go结尾
    • 所有方法,func Testxxx(t *testing.T)
    • 初始化逻辑,放在 TestMain
  • 单元测试工具,assert 包

  • 覆盖率工具 JudgePassLine(score int) 简单地判断覆盖率

项目设计思路

需求设计

需求描述(你想实现怎样的效果)

  • 名称:社区话题界面
  • 功能

    • 展示话题(标题+文字描述)和回帖列表
    • 仅仅是先web服务端,暂时不考虑前端
    • 话题和回帖暂时用文件存储

需求用例(都有哪些人,对哪些事物,做了哪些事情)

  • 用户
  • 话题页面
  • 发帖列表

ER图设计(事物之间具体的关系是什么)

分层结构

  • 数据层,也就是模型和数据库,外部数据的curd
  • 逻辑层,也就是业务层,核心业务的逻辑输出,Service
  • 视图层,Controller,处理交互

工具

  • Gin 高性能GoWeb框架
  • Go Mod