目录
前言
- 微服务的环境需要安装较多的软件,甚至环境就可以卡掉很多同学,这里特意整合一篇关于环境搭建的
- 在项目开发前介绍下包的常识
- 在项目开发前统一一下go的编码规范
一、环境搭建汇总
随着后续的沉淀会陆续补充
- CentOS7参考地址:https://blog.csdn.net/qq23001186/article/details/125693739
- putty参考地址:https://blog.csdn.net/qq23001186/article/details/125696001
- git参考地址:https://blog.csdn.net/qq23001186/article/details/125695151
- docker参考地址:https://blog.csdn.net/qq23001186/article/details/125695822
- mysql参考地址:https://blog.csdn.net/qq23001186/article/details/125696882
- Go参考地址:https://blog.csdn.net/qq23001186/article/details/125697346
- Nodejs参考地址:https://blog.csdn.net/qq23001186/article/details/125698420
- grpc参考地址:https://blog.csdn.net/qq23001186/article/details/125729248
- YApi参考地址:https://blog.csdn.net/qq23001186/article/details/125832921
- redis参考地址:https://blog.csdn.net/qq23001186/article/details/126023939
- consul参考地址:https://blog.csdn.net/qq23001186/article/details/126025565
- nacos参考地址:https://blog.csdn.net/qq23001186/article/details/126084869
- ES+kibana+IK参考地址:https://blog.csdn.net/qq23001186/article/details/126324385
- rocketMq参考地址:https://blog.csdn.net/qq23001186/article/details/126337637
- kong参考地址:https://blog.csdn.net/qq23001186/article/details/126357870
- jenkins参考地址:https://blog.csdn.net/qq23001186/article/details/126372380
二、GOPATH和GoModules比较
1 - GOPATH项目
- go1.12之前新建项目GOPATH方式:需要建立在GOPATH的src目录,否则会有问题
- GOPATH方式需要关闭Go modules:
go env -w GO111MODULE=off
- GOPATH方式的包查找顺序
- 先查找GOPATH/src目录下是否有import的包
- 再查找GOROOT/src目录下是否有import的包
- GOPATH方式的项目总结
- 一定要将代码新建到GOPATH目录之下src
- 需要将GO111MODULE设置为off
2 - GoModules项目
- GoModules方式需要开启Go modules:
go env -w GO111MODULE=on
- GoModules方式对项目的目录没有要求:只要有go.mod即可
- go.mod可以指定包的版本号
三、go编码规范
1 - 命名规范
- 当命名以大写字母开头:当命名(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的public)
- 当命名以小写字母开头:当命名以小写字母开头,则对包外是不可见的,但是他们在整个包的内部是可见并且可用的(像面向对象语言中的private)
- 包名package规范:保持package的名字和目录保持一致,尽量采取有意义的包名,简短有意义,尽量和标准库不要冲突;包名应该为小写单词,不要使用下划线或者混合大小写
package model
、package main
- 文件名规范:尽量采取有意义的文件名,简短有意义,应该为小写字母,使用下划线分隔各个单词
user_model.go
- 结构体命名:采用驼峰命名法,首字母根据访问控制大写或小写;struct声明和初始化采用多行
package main
import "fmt"
type User struct {
UserName string
Email string
}
func main() {
u := User{
UserName: "tom",
Email: "cat",
}
fmt.Println(u.UserName)
}
- 接口命名规范:命名规则基本和结构体类型差不多;单个函数的结构名以er作为后缀,例如Reader、Writer
type Reader interface {
Read(p []byte) (n int, err error)
}
- 变量命名:
- 和结构体类似,变量名一般遵循驼峰法,首字母根据访问控制原则大写或者小写
- 但遇到特有名词时,需要遵循以下规则
- 如果变量为私有,且特有名词为首个单词,则使用小写,如apiClient
- 其他情况都应该使用该名词原有的写法,如APIClient、repoID、UserID
- 错误示例:UrlArray,应该统一成urlArray或URLArray
- 若变量类型为bool类型,则名称应该以Has、Is、Can或Allow开头
var isExit bool
var hasConflict bool
var canManage bool
var allowGitHook bool
- 常量命名:
- 常量均需使用全部大写字母组成,并使用下划线分词,
const APP_VER = "1.0"
- 如果是枚举类型的常量,需要先创建相应类型
- 常量均需使用全部大写字母组成,并使用下划线分词,
type Scheme string
const (
HTTP Scheme = "http"
HTTPS Scheme = "https"
)
2 - 注释规范
- 单行注释:任意地方
//
- 多行注释:以
/*
开头,*/
结束 - go自带的godoc文档工具:
- go语言自带的godoc工具可以根据注释生成文档,生成可以自动生成对应的网站(golang.org就是使用godoc工具直接生成的),注释的质量决定了生成文档的质量;
- 每个包都应该有一个包注释,在package子句之前有一个块注释;对于多文件包,包注释需要存在于一个文件中,任何一个都可以;包评论应该介绍包,并提供与整个包相关的信息;它将首先出现在godoc页面上,并应设置下面的详细文档
- 包注释:每个包都应该有一个包注释,一个位于package子句之前的块注释或行注释;包如果有多个go文件,只需要出现在一个go文件中(一般是和包同名的文件)即可;包注释应该包含下面基本信息(请严格按照这个顺序:简介、创建人、创建时间)
- 包的基本简介(包名 简介)
- 创建者,格式:创建人:rtx名
- 创建时间,格式:创建时间:yyyyMMdd
// util包:该包包含了项目公用的一些常量,封装了项目中一些共用函数
// 创建人:zjp
// 创建时间:20220709
package util
- 结构体(接口)注释:
- 每个自定义的结构体或者接口都应该有注释说明,该注释对结构进行简要介绍,放在结构体定义的前一行,格式为:结构体名 , 结构体说明;
- 同时结构内的每个成员变量都要有说明,该说明放在成员变量的后面(注意对齐)
// User , 用户对象,定义了用户的基础信息
type User struct {
UserName string //用户名
Email string //邮箱
}
- 函数(方法)注释:每个函数,或者方法(结构体或者接口下的函数称为方法)都应该有注释说明,函数的注释应该包括三个方面(严格按照此顺序编写)
- ①.简要说明,格式说明:以函数名开头, " , "分隔说明部分
- ②.参数列表:每个一个参数,参数名开头, " , "分隔说明部分
- ③.返回值:每行一个返回值
// NewAttrModel , 属性数据层操作类的工厂方法
// 参数:
// ctx:上下文信息
// 返回值:
// 属性操作类指针
func NewAttrModel(ctx *common.Context) *AttrModel{
}
- 代码逻辑注释:对于一些关键位置的代码逻辑,或者局部较为复杂的逻辑,需要有相应的逻辑说明,方便其他开发者阅读该段代码
// 从 Redis 中批量读取属性,对于没有读取到的 id ,记录到一个数组里面,准备从 DB 中读取
xxxx
xxxxxx
xxxxxx
- 注释风格:统一使用中文注释,对于中英文字符之间严格使用空格分隔,这个不仅仅是中文和英文之间,英文和中文标点之间也都要使用空格分隔
- Redis、id、DB和其他中文字符之间都是使用了空格分隔
- 建议全部使用单行注释
- 和代码规范一样,单行注释不要过长,禁止超过120字符
- Redis、id、DB和其他中文字符之间都是使用了空格分隔
// 从 Redis 中批量读取属性 , 对于没有读取到的 id , 记录到一个数组里面 , 准备从 DB 中读取
3 - import规范
- import多行:import在多行的情况下,goimports会自动帮我们格式化,但是我们这里还是规范一下import的一些规范,如果你在一个文件里面引入了一个package,还是建议采用如下格式
import (
"fmt"
)
- import多类型包:假设你引入了三种类型的包,标准库包、第三方包、程序内部包,建议采用如下方式进行组织包 -> 有顺序的引入包,不同类型采用空格分离,第一是标准库、第二是第三方包、第三是项目包
import (
"encoding/json"
"fmt"
"strings"
"github.com/astaxie/beego"
"github.com/go-sql-driver/mysql"
"myproject/controller"
"myproject/models"
"myproject/utils"
)
- 在项目中不要使用相对路径引入包:但是如果是引入本项目中的其他包建议使用相对路径
import (
"../net" //bad
"github.com/repo/proj/src/net" //good
)
4 - 错误处理规范
- 不要丢弃error:错误处理的原则就是不能丢弃任何有返回err的调用,不要使用
_
丢弃,必须全部处理;接收到错误,要么返回err,或者使用log记录下来 - 尽早return:一旦有错误,马上返回
- 尽量不要使用panic:除非你知道你在做什么
- 错误描述如果是英文必须为小写,不需要标点结尾
- 采用独立的错误流进行处理
// 错误写法
if err != nil {
// error handling
} else {
// normal code
}
// 正确写法
if err != nil {
// error handling
return // or continue, etc.
}