golang社区规范

目录结构说明

/your_project
├── cmd
│ └── your_project
│ └── main.go # 主程序入口
├── configs
│ └── config.yaml # 配置文件
├── internal # 内部应用代码(不可导出)
│ ├── app
│ │ ├── controllers # 控制器层
│ │ ├── models # 数据模型层
│ │ ├── services # 业务逻辑层
│ │ └── repositories # 数据访问层
│ ├── pkg
│ │ ├── logger # 日志包
│ │ └── middleware # 中间件
│ └── routes # 路由定义
├── pkg # 可重用的包
│ ├── util # 通用工具包
│ └── ginutil # Gin 相关工具
├── scripts # 脚本文件(如数据库迁移、初始化等)
├── test # 测试文件
├── go.mod # Go modules 依赖管理
└── go.sum # Go modules 依赖管理

示例

github.com/your_username/your_project
├── cmd
│ └── your_project
│ └── main.go
├── configs
│ └── config.yaml
├── internal
│ ├── app
│ │ ├── controllers
│ │ │ └── user_controller.go
│ │ ├── models
│ │ │ └── user.go
│ │ ├── services
│ │ │ └── user_service.go
│ │ └── repositories
│ │ └── user_repository.go
│ ├── pkg
│ │ ├── logger
│ │ │ └── logger.go
│ │ └── middleware
│ │ └── auth_middleware.go
│ └── routes
│ └── router.go
├── pkg
│ ├── util
│ │ └── util.go
│ └── ginutil
│ └── ginutil.go
├── scripts
│ └── migrate.sh
├── test
│ └── user_test.go
├── go.mod
└── go.sum

简介

规范流程

配置流程详情

  1. husky

    • 作用:自定义git hooks执行后的事件处理

    • 常用的hook:pre-commit、commit-msg:pre-commit通常与lint-staged搭配使用,校验与格式化git暂存区内容;commit-msg通常与commitlint搭配校验commit msg的格式是否符合规范。

    • .husky/pre-commit hook 文件配置

      #!/usr/bin/env sh
      . "$(dirname "$0")/_/husky.sh"
      npx lint-staged
    • .husky/commit hook 文件配置

      #!/usr/bin/env sh
      . "$(dirname "$0")/_/husky.sh"
      npx --no-install commitlint --edit "$1"
  2. lint-staged

    • 作用:提交代码前,对暂存区的代码做语法检测以及格式化修复使用,常搭配eslint以及prettier,最新的可以搭配biome,以下都是使用biome

    • 支持的配置文件有多种:可以放在package.json中也可单独使用配置文件,我们都使用单独的.lintstagedrc.json文件,保持package.json的整洁,lint-staged搭配biome的配置如下

      {
      "*": ["biome check --apply --no-errors-on-unmatched --files-ignore-unknown=true"]
      }
    • eslint+prettier配置方法太繁琐,博主已不再使用

  3. commitizen

    • 作用:命令行交互式的方式录入commit-msg:包括 type、scope、subject、short desc、long desc、break change、fix issues等

    • 配置如下:

      # 安装
      pnpm ad d -D commitizen

      # 替换 git commit ===> git cz
      git cz
    • commitizen适配器:用与扩展commitizen,咋们使用cz-conventional-changelog适配器,常用的还有git-cz、cz-git等

    • cz-conventional-changelog在package.json中的配置如下:

      "config": {
      "commitizen": {
      "path": "cz-conventional-changelog"
      }
      }
  4. commitlint

    • 作用:校验commit msg是否与配置的规范一致

    • 安装:commitlint/cli(必须)、commitlint/config-conventional(可选,该npm包是已经写好的一些lint规则,可以选择不使用自己在commitlint配置文件中自定义规则)

    • 配置如下:我们直接使用默认的commitlint/config-conventional规则即可,使用.commitlintrc.json文件配置,也支持其他格式的配置文件,详见官方文档。

      {
      "extends": ["@commitlint/config-conventional"]
      }
    • 规范中常用的type-enum配置如下(行业中常用合计11种,也可以定义自己团队的type):

      type desc
      feat 添加新功能
      fix 缺陷修复
      perf 提高性能的改动
      docs 文档内容修改
      style 不影响代码含义的改动,例如去掉空格、改变缩进、增删分号
      build 构造工具的或者外部依赖的改动,例如webpack,npm
      refactor 代码重构
      revert 代码回滚
      test 添加测试或者修改现有测试
      ci CI(持续集成服务)有关的改动
      chore 构建过程或辅助工具的变动
  5. change-log

    • 作用:使用标准的commit msg生成change log

    • 配置(我们使用conventional-changelog-cli):

      # 安装
      pnpm add -g conventional-changelog-cli
      # CHANGELOG.md 生成

      # 该语句不会覆盖之前的change log,向之前的文件中追加新的change
      conventional-changelog -p angular -i CHANGELOG.md -s

      # 第一次生成change log
      conventional-changelog -p angular -i CHANGELOG.md -s -r 0
    • npm pkg version 关联详见官网

简介

  • go语言中引入与导出是通过包机制实现的

  • package是代码组织和封装的基本单位,每个Go文件都必须声明一个包,包名通常与所在目录名相同

导出

  • 标识符(变量、常量、类型、函数、结构体字段等))以大写字母开头则是导出,可以被其他包访问,小写只能内部访问

  • go语言中是区分大小写的

  • 例子如下:

    var Con = "" // 外部可访问
    var con = "" // 只有包内部可访问

    func Test(){} // 外部可访问
    func test(){} // 只有包内部可访问

导入

  • 导入使用import关键字

  • 可以多行import单独导入,也可以分组导入,如下:

    // 单独导入
    import "fmt"
    import "math"

    // 分组导入
    import (
    "fmt"
    "math"
    )
  • 别名导入(如果没有别名,默认的是取导入路径的最后一个单词作为包名,调用包内部暴露的标识)

    // 1.别名导入
    import f "fmt"

    func main() {
    f.Println("Hello, world!")
    }

    // 2.默认导入
    import (
    "myproject/packages/package1"
    )

    func main() {
    package1.DoSomething()
    }

editorconfig 作用

让同一项目在不同编辑器下格式保持一致(例如:缩进、换行符等)

原理

支持的编辑器在打开项目时会读取该文件,应用到代码中,同时与版本控制完美契合

配置内容解读

# 顶级 EditorConfig 文件
root = true

# Unix 风格的换行符,并在每个文件末尾添加一个换行符
[*]
end_of_line = lf
insert_final_newline = true

# 使用大括号扩展符号匹配多个文件
# 设置默认字符集
[*.{js,py}]
charset = utf-8

# 使用 4 个空格缩进
[*.py]
indent_style = space
indent_size = 4

# 使用制表符缩进(未指定大小)
[Makefile]
indent_style = tab

# 重写 lib 目录下所有 JS 文件的缩进
[lib/**.js]
indent_style = space
indent_size = 2

# 精确匹配 package.json 或 .travis.yml 文件
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2

Tip 1:https需要默认开启443端口,配置前请先确认
Tip 2:nginx 服务器需要安装 http_ssl_module 模块

一. 下载证书文件并解压,解压后有四个文件(以域名“xxx.com”为例)

  • xxx.com_bundle.crt - 证书文件
  • xxx.com_bundle.pem - 证书文件
  • xxx.com_bundle.key - 私钥文件
  • xxx.com_bundle.csr - csr文件,提供给CA机构的,安装时可忽略

二. 证书以及私钥文件上传至云服务某一个目录存放(只需上传上面四个中.crt以及.key结尾的文件)

我的存放目录:/etc/my-nginx

三. 运行nginx容器时指定nginx.conf 配置中证书以及私钥在宿主主机目录的映射

docker run -p 443:443 -v /etc/my-nginx:/etc/nginx/certs

四. 具体ssl在nginx的配置可参考下面

server {
#SSL 默认访问端口号为 443
listen 443 ssl;
#请填写绑定证书的域名
server_name cloud.tencent.com;
#请填写证书文件的相对路径或绝对路径
ssl_certificate cloud.tencent.com_bundle.crt;
#请填写私钥文件的相对路径或绝对路径
ssl_certificate_key cloud.tencent.com.key;
ssl_session_timeout 5m;
#请按照以下协议配置
ssl_protocols TLSv1.2 TLSv1.3;
#请按照以下套件配置,配置加密套件,写法遵循 openssl 标准。
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
#网站主页路径。此路径仅供参考,具体请您按照实际目录操作。
#例如,您的网站主页在 Nginx 服务器的 /etc/www 目录下,则请修改 root 后面的 html 为 /etc/www。
root html;
index index.html index.htm;
}
}
server {
listen 80;
#请填写绑定证书的域名
server_name cloud.tencent.com;
#把http的域名请求转成https
return 301 https://$host$request_uri;
}

注:腾讯云ubuntu安装过程默认不设置root用户名以及密码,需要手动开启root用户登录

  1. 使用初始化用户名密码(默认是ubuntu)登录云服务器
  2. 执行下面的命令,设置root密码
sudo passwd root
  1. 执行下面的命令,修改ssh配置文件
sudo vim /etc/ssh/sshd_config
  1. 按i切换到编辑模式,找到#Authentication,将PermitRootLogin 修改为yes,然后保存
PermitRootLogin yes # 默认值是 prohibit-password
  1. 重启ssh服务后,root用户登录验证配置是否生效
sudo service ssh restart

查看是否安装wget

which wget

没有安装,升级包管理器再安装

sudo apt-get update
sudo apt-get install wget

安装docker

wget -qO- https://get.docker.com/ | sh

验证是否安装成功

sudo docker run hello-world
0%