Go 语言进阶 | 青训营笔记

100 阅读3分钟

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

  • 本文为青训营课程笔记,配合原课程食用效果更佳哦~(也可以转成思维导图食用)

课程笔记

  1. 语言进阶

    1. 多线程(go为协程kb级别,所以甚至可以开上万)

    2. 方式go func(){} (parms)(猜测func(){}为匿名函数)

    3. chan类型(channal通道),用于收发数据,建议的线程间共享数据方式

      1. 可设置缓冲区 c := make(chan, valueType, [size])
    4. 也可通过共享内存来实现数据共享,加锁机制

      1. lock = sync.Mutex声明变量

        1. Lock()函数加锁,Unlock()释放锁
    5. WaitGroup阻塞

      1. WaitGroup方法:

        1. Add(delta int)增加delta个计数
        2. Done()减少一个计数
        3. Wait()阻塞直到计数为0
      2. 功能

        1. 可令delta为线程数,执行完成Done(可用defer)
        2. 最后Wait()即可在此时达成同步,就不用Sleep
  2. 依赖管理

    1. GOPATH

      1. 直接get到src中:无法多版本控制
    2. Go Vendor

      1. 为依赖包创建副本在vendor文件夹下:版本不兼容问题
    3. Go Module

      1. 配置go.mod,设置中间仓库Proxy

      2. 版本

        1. 语义化版本

          • ${MAJOR}.${MINOR}.${PATCH}
          • V1.3.0
          • V2.3.0
        2. 基于 commit 伪版本

          • vX.0.0-yyyymmddhhmmss-abcdefgh1234
          • v0.0.0-20220401081311-c38fb59326b7
          • v1.0.0-20201130134442-10cb98267c6c
      3. 标记

        1. // indirect标记间接依赖
        2. +incompatiable标记没有go.mod可能不兼容
      4. 选择版本应该为能兼容的最低版本

        • 如要求1.3、1.4,那么选择1.4
        • 2.x不能选,主版本可能会不兼容
        • 1.5不能选,违背“最低版本”
        • 1.3不能选,不兼容1.4
        • 不过也不会分开来按需选择调用1.3/1.4
      5. proxy作为中间仓库,优先在此查找依赖,无则源站点

      6. go get命令

        • @update 默认
        • @none 删除依赖
        • @v1.1.2 tag版本,语义版本
        • @23dfdd5 特定的commit
        • @master 分支的最新commit
      7. go mod命令

        1. init 初始化,创建go.mod文件
        2. download 下载模块到本地缓存
        3. tidy 增加需要的依赖,删除不需要的依赖
  3. 测试

    1. 单元测试
      1. 命名:"对应文件名"+"_test"(.go),TestXXX,TestMain

      2. 测试

        1. 直接!=判断
        2. 导入"github.com/stretchr/testify/assert","test":assert.Equal(t, false, isPass)
      3. 覆盖率:尽可能测试到所有条件分支,代码覆盖率可一定程度反映

      4. Tips:

        • 一般覆盖率:50%~60%,较高覆盖率80%+。
        • 测试分支相互独立、全面覆盖。
        • 测试单元粒度足够小,函数单一职责。
    2. Mock测试

      打桩:解决依赖问题

      • patch(f1,f2):f1被换成f2(更改函数地址)
      • unpatch(f1):换回来
    3. 基准测试

      测试性能(fastrand快速随机数,否则随机数卡性能)

      • InitServerIndex()初始化
      • b.ResetTimer()重置时间
      • b.RunParallel(func……)运行……
  4. 项目实战

    1. 需求分析

    2. ER图(Entity Relationship Diagram)

    3. 分层

      • 数据层:数据 Model,外部数据的增删改查
      • 逻辑层:业务 Entity,处理核心业务逻辑输出
      • 视图层:视图 view,处理和外部的交互逻辑
    4. 具体

      1. 查询使用map
      2. service校验参数-准备数据-组装实体 (注意if err…return)
      3. 实现参见源代码
    5. 流程小结

      1. 项目拆解
      2. 代码设计
      3. 测试运行

总结收获

通过样例与知识点结合的方式,学到了go的强大并发支持;

通过项目样例的讲解,更了解了一个项目的诞生过程;

又是收获满满的一天,一起加油吧