golang基础 | 青训营笔记

114 阅读2分钟

语言特性

  • 高性能、并发
  • 语法简单
  • 标准库丰富
  • 工具链完善
  • 静态编译
  • 快速编译
  • 跨平台
  • 垃圾回收

有用工具

Convert curl commands to Python, JavaScript and more

image.png

  • Proxy SwitchyOmega

Powershell下curl报错

Powershell 中有一个Cmdlet叫做Invoke-WebRequest,它有两个别名分别是curlwget,当使用curl时默认调用了Invoke-WebRequest,所以会产生报错

  • 解决方案一
remove-item alias:curl
  • 解决方案二
curl.exe --version

go进阶

协程

  • 协程(coroutine)类似于线程,但协程是协作式多任务,而线程典型是抢占式多任务,因而协程提供并发而非并行
  • 协程可以用于硬性实时语境,,协程之间切换不需要任何系统调用和阻塞调用,不需要OS支持,因而效率更高
  • go语言倡导不要通过共享数据,而要通过通信的方式来进行协程间通信
  • go可以通过channel来进行通信,其可以被设置为有/无缓冲

事实上,缓冲区是处理消费者生产者二者效率差距较大而造成的资源浪费的有效手段之一

  • channel在go中是线程安全的,面对并发问题,优先考虑channel

依赖管理

  • GOPATH
    • 项目代码直接依赖$GOPATH/src下的代码
    • go get下载最新版本包到src下
    • 无法实现多版本管理
  • GO Vendor
    • 项目目录下增加vendor文件,所有依赖包放在其下
    • 解决了多个项目需要同一个package包的版本的冲突问题,但每个项目需要引入一个依赖的副本
    • 依赖的依赖之间可能出现版本冲突

本质上,这种方式还是通过源码解决依赖冲突,如此势必冗余且不灵活

  • Go Module
    • 通过go.mod文件管理依赖包版本
    • go get/go mod 指定工具管理依赖包
    • 定义版本规则和管理项目之间的依赖关系

依赖管理三要素 - 配置文件 go.mod - 中心仓库管理依赖库 Proxy(代理各个包源,保证稳定性) - 本地工具 go get/mod

image.png

  • indirect 间接依赖关键字
  • incompatible 对于没有go.mod文件,且主版本2+的依赖

依赖版本支持

  • 语义化版本${MAJOR}.${MINOR}.${PATCH}
    • MAJOR 不兼容,大版本
    • MINOR 兼容,小版本
    • PATCH 小的修复
  • 基于commit的伪版本

依赖分发-变量

    GOPROXY="https://proxy1,cn,https://proxy2.cn,direct"

工具

  • go get example.org/pkg
  • go mod
    • init 初始化
    • download 下载模块到本地缓存
    • tidy 增加需要的依赖,删除不需要的依赖

测试

单元测试

  • 所有文件以_test.go结尾
  • func TestXXX(*testing.T)
  • 初始化逻辑放入TestMain中

MOCK

保证幂等稳定

github.com/bouk/monkey

快速实现为函数/方法打桩

基准测试

  • 优化代码
  • 内置的测试框架提供了基准测试的能力

总体来说,go语言在语法简单,高性能,工具链完善等方面还是比较突出的. 看起来历史包袱也小,属于比较现代化的编程语言;