第二节课:工程实践|青训营笔记

60 阅读3分钟
  • 语言进阶\

    • 并发和并行\

      • 并发\

        • 多个任务在一个核的cpu运行\
        • 通过时间片\
      • 并行\

        • 多个任务在多个核的cpu运行\
    • goroutine\

      • 线程和协程\

        • 线程\

          • 内核态\
          • 线程跑多个协程\
          • 栈MB级别\
        • 协程\

          • 用户态\
          • 轻量级线程\
          • 栈KB级别\
    • csp\

      • 通过通信共享内存,而不是共享内存实现通信\
    • channel\

      • 无缓冲和有缓冲\

        • 无缓冲\

          • 同步\
          • make(chan int)\
        • 有缓冲\

          • 不同步\
          • make(chan int, 2)\
          • 生产者消费者模型\
    • sync\

      • 并发安全Lock\

        • sync.Mutex\
      • waitGroup计数器\

        • Add()\
        • Done()\
        • Wait()\
  • 依赖管理\

    • 演进\

      • GoPath\

        • 环境变量$GOPATH\

          • bin\

            • 项目编译的二进制文件\
          • pkg\

            • 项目编译的中间产物,加速编译\
          • src\

            • 项目源码\
        • 项目代码直接以来src下的代码\
        • go get下载最新的包到src目录下\
        • 弊端\

          • 场景\

            • A和B依赖某一个package的不同版本\
          • 问题\

            • 无法实现package多版本控制\
      • Go Vendor\

        • 解决了GoPath同一个package版本冲突问题\

          • 每个项目引入一份依赖副本\
        • 弊端\

          • 无法控制以来的版本\
          • 更新可能会出现依赖冲突\
      • Go Module\

        • 通过go mod文件管理依赖包版本\
        • 通过go mod/go get指令工具管理依赖包\
    • 三要素\

      • 配置文件,描述依赖\

        • go.mod\

          • indirect\

            • A->B->C\

              • A、B直接依赖\
              • A、C间接依赖\
          • imcompatible\

            • 对于没有go.mod文件也版本号为2+的依赖会使用到\
      • 中心仓库管理依赖库\

        • proxy\

          • 依赖分发\

            • 使用github、svn等存在的问题\

              • 无法保证构建的稳定性\
              • 无法保证依赖的可用性\
              • 增加第三方压力\
            • go proxy\

              • 配置环境:GOPROXY\
              • proxy1->proxy2->direct\
      • 本地工具\

        • go mod\

          • init\

            • 初始化,创建go mod文件\
          • download\

            • 下载模块到本地缓存\
          • tidy\

            • 增加需要的依赖,删除不需要的依赖\
        • go get\
  • 测试\

    • 单元测试\

      • 流程\

        • 输入\
        • 测试单元\
        • 输出\
        • 输出和期望校对\
      • 优点\

        • 保证代码质量\
        • 问题排查定位精准\
      • 规则\

        • 以_test.go结尾\
        • func TestXxx(t *testing.T)\
        • 初始化逻辑放在TestMain中\
      • assert工具\

        • 有较多的方法可以利用\
      • 覆盖率\

        • go test xxx_test.go --cover\
    • mock测试\

      • 依赖\

        • 需要保持\

          • 幂等\
          • 稳定\
      • 打桩\

        • 用函数A替换函数B\
        • A为打桩函数\
        • B为原函数\
      • A依赖B\

        • mock的对象就是B,避免A对B的直接依赖\
    • 基准测试\

      • 对某个功能的性能进行量化或对比性的测试\
    • 覆盖率依次增加,成本依次减少\

      • 回归测试\

        • 手动点击主要的逻辑\
      • 集成测试\

        • 自动化测试接口功能性\
      • 单元测试\

        • 开发者对单独的函数功能测试\
  • 项目实战\

    • 需求描述\

      • 社区话题页面\

        • 展示话题(标题、文字描述)和回帖列表\
        • 仅实现本地web服务\
        • 话题和回帖数据用文件存储\
    • 需求用例\

      • 用户浏览话题页面\

        • 用户\

          • user\
        • 话题页面\

          • topic\
          • post list\
    • E-R图\

      • 话题-回帖:一对多\

        • topic\

          • id\
          • title\
          • content\
          • create_time\
        • post\

          • id\
          • topic_id\
          • content\
          • create_time\