[总结]Golang技术栈
目录
前言
目前我主攻golang。golang将作为主要的服务编写代码,所以会涵盖我所能接触的的绝大多数后端技术。另外,有两类问题我认为是超越语言的,不会在这里提及,一是关于代码设计模式和服务架构方面的问题,二是业务相关(包括通用的业务),比如token登录这种问题。大类上分为以下类别:
- 测试:单元测试,mock测试,request测试,性能测试
- CI/CD: 主要是CI
- 常用框架五件套:web,数据库连接,配置,log,监控
- 文档编写工具
0. 从功能角度看需要什么工具
总结下来发现内容有点多,所以只做简单介绍。针对其中的某些简单叙述不够或者文档未说明的点,后面单开文章描述。
- 测试: 单元测试,mock测试
- CI: 持续集成工具
- go-client: 适用于开发k8s operator的库
- viper: config配置
- gin: web框架
- go-svc: golang包装器
- gorm: mysql
- redis
- kafka
- etcd和zookeeper
- go routine和channel
- klog,glog: log库
- sentry: 在线debug工具
- swger,puml: 文档工具
测试
我觉得相比开发来说,测试是更加重要的。
-
单元测试: 在一个多人开发项目中,我们有时很难知道别人的改动是否对我们这块的功能有影响,所以对于关键节点编写单元测试,并且把自动运行单测写入到CI中是至关重要的。看似增加了工作量,可从长期来看,是可以减少大量的功能测试时间,减少潜在风险的。
-
API测试:这个之前我用postman, 后来看到别的同事直接把测试案例用http里面,感觉是一种更好的办法。
|
|
- Mock测试: mock测试对于接口测试非常重要。设想一个场景:我需要获取一份数据,但是数据来源有多个,这种情况下我们可能会先编写一个接口用来隔离具体获取数据源的struct。我们如何在不编写实际数据源获取的struct的情况下测试方发是否有效呢,就可以用mock了。
CI
CI太重要了,第一是跟上面说的一样,可以很好的实现自动测试。此外,还可以配置一系列静态代码检查,格式化,检查函数复杂度等等。可以让我们的代码质量提升一个数量级。在多人开发系统中是必不可少的。
- gitlab-ci 可以根据stage来编写流水线,当然,实际使用要复杂的多。多数情况会结合makefile来使用。
|
|
- golangci-lint golang的静态代码分析工具 ,第三方开发了大量的工具,举一些常例子:
gocritic:gocritic 是一个 Go 代码静态分析工具,它提供了一系列检查,用于发现代码中的潜在问题和改进机会。 gocognit:gocognit 是一个用于检测代码复杂度的工具,它会根据代码中的复杂性来提供建议。 gomnd:gomnd 是一个用于检测魔法数字(magic number)的工具,它会发现代码中硬编码的数字,并提供建议将其提取为常量或者变量。 gosec:gosec 是一个用于检测 Go 代码中安全问题的工具,例如常见的安全漏洞和代码缺陷。
- pre-commit 在项目开发中,我们都会使用到 git,我们可使用git hook实现在git commit的时候进行代码检查。直接编写git hooks脚本,时间久了之后会比较乱,推荐使用pre-commit框架来方便管理。 demo:请看官方案例,写的很不错 推荐一些比较好的库:
点我展开看案例
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0 # Use the ref you want to point at
hooks:
- id: check-added-large-files
- id: check-executables-have-shebangs
exclude: t/cmd/common.sh
- id: check-shebang-scripts-are-executable
- id: check-symlinks
- id: destroyed-symlinks
- id: check-case-conflict
- id: check-merge-conflict
- id: check-json
- id: check-yaml
- id: check-toml
- id: detect-private-key
- id: end-of-file-fixer
exclude: docs/swagger.json
exclude_types:
- svg
- id: fix-byte-order-marker
- id: forbid-submodules
- id: no-commit-to-branch
args:
- -b release
- -b master
- id: check-merge-conflict
- id: trailing-whitespace
args:
- --markdown-linebreak-ext=md
- repo: https://github.com/crate-ci/typos
rev: typos-dict-v0.9.26
hooks:
- id: typos
exclude: .*.http|.mod|.token
exclude_types:
- json
- repo: https://github.com/dnephin/pre-commit-golang
rev: v0.5.1
hooks:
- id: go-generate
- id: go-fmt
- id: go-imports
- id: go-vet
- id: go-mod-tidy
- id: go-cyclo
exclude: ^pkg/
args: [ -over=16 ]
- id: golangci-lint
- repo: https://github.com/igorshubovych/markdownlint-cli
rev: v0.34.0
hooks:
- id: markdownlint
exclude: docs/swagger.md
- id: markdownlint-fix
exclude: docs/swagger.md
- repo: https://github.com/compilerla/conventional-pre-commit
rev: v2.2.0
hooks:
- id: conventional-pre-commit
stages:
- commit-msg
args: # optional: list of Conventional Commits types to allow e.g. [feat, fix, ci, chore, test]
- feat
- fix
- ci
- chore
- test
- refactor
- build
- release
- revert
- perf
- docs
- typo
- style
- repo: https://github.com/jorisroovers/gitlint
rev: v0.19.1
hooks:
- id: gitlint
stages:
- commit-msg
文档编写工具
支付宝
微信