GO学习笔记(2) - 语言规范
命名规范
1、适合所有命名规则:包括常量、变量、类型、函数名、结构字段等等
2、以大写字母开头,如Group1,表示该对象就可以被外部包的代码所使用。
3、以小写字母命令,则表示对包外不可见
4、关键字不能作为标识符
package规范
1、package名称与目录名保持一致,名称要有意义,不能和标准库冲突;
2、禁用相对路径;
3、包名是小写单词,不要使用"_"下划线与混合大小写;
// wrong
import "../../../repo"
// correct
import "github.com/repo/package
文件命名
1、简单,有意义,小写单词,使用下划线分隔各个单词。
my_test.go
结构体命名
1、 驼峰命名法,首字母根据访问控制大写或者小写
2、 struct 申明和初始化格式采用多行,例如下面:
type User struct{
Username string
Email string
}
//多行初始化
u :=User{
Username: "astaxie",
Email: "astaxie@gmail.com"
}
接口命名
1、驼峰命名法,首字母根据访问控制大写或者小写
2、单个函数的结构名以“er"为后缀,例如Reader,Writer。
type Reader interface{
Read(P []type)(n int,err error)
}
变量命名
1、命名遵巡驼峰标准,首字母根据访问控制原则大写或者小写
2、不能使用"_"开头
3、不允许定义没有用的变量,所有定义的变量都必须用上,否则编译器报错
4、若变量类型为 bool 类型,则名称应以 Has, Is, Can 或 Allow 开头
var isExist bool
var hasConflict bool
var canManage bool
var allowGitHook bool复制代码
5、其他特有名词
- 如果变量为私有,且特有名词为首个单词,则使用小写,如 apiClient
- 其它情况都应当使用该名词原有的写法,如 APIClient、repoID、UserID
- 错误示例
UrlArray,应该写成 urlArray 或者 URLArray
常量命名
- 常量以大写开头,单词间用下划线表示
const APP_VER = "1.0"
- 枚举常量,需要先创建类型
type Scheme string
const{
HTTP Scheme = "http"
HTTPS Scheme = "https"
}
注解规范
- 两种注解风格,分别是C与C++风格。行注解是常态。
- 块注解不可嵌套,块注解主要显示为包注解,即包的文档描述;也用于注释成块的代码片段。
/* 多行(块)注解 */
//注册内容
-
godoc
为go自带注解生成工具,可生成对应的站点,新版中需要手工安装 -
包注释:每个包都需要有一个包注释,格式
//包的基本简介(包名,简介)
//创建者, 格式: 创建人: rtx 名
//创建时间,格式: 创建时间: yyyyMMdd
//util包, 该包包含了项目共用的一些常量,封装了项目中一些共用函数。
//创建人: hanru
//创建时间: 20190419
函数注解
1、所有的函数以及结构体头部必须要写注释,注解的规范是名称+说明
2、如果不写或者是不规范的话,代码虽然可以运行,但是无法通过golint的规范检测。
// HelloWorld print hello world
func HelloWorld() {
fmt.Println("Hello World")
}
// NewtAttrModel , 属性数据层操作类的工厂方法
// 参数:
// ctx :上下文信息
// 返回值:
// 属性操作类指针
func NewAttrModel(ctx *common.Context) *AttrModel {
}
结构体注解
// User , 用户对象,定义了用户的基础信息
type User struct{
Username string // 用户名
Email string // 邮箱
}
代码注解
//从 Redis 中批量读取属性,对于没有读取到的 id , 记录到一个数组里面,准备从 DB 中读取
xxxxx
xxxxxxx
xxxxxxx复制代码
代码风格
缩进和折行
- tab缩进,缩进直接使用 gofmt 工具格式化即
- 折行方面,一行最长不超过120个字符,超过的请使用换行展示。
- Goland开发工具,可以直接使用快捷键:ctrl+alt+L,即可。
语句的结尾
- 不需要类似于Java需要分号结尾,默认一行就是一条数据
- 多个语句写在同一行,它们则必须使用 ;
括号和空格
- 可直接使用 gofmt 工具格式化
- go 会强制左大括号不换行,换行会报语法错误
- 所有的运算符和操作数之间要留空格
- if表达式,不加()号
// wrong
if expression
{
...
}
// correct
if expression {
...
}
import
- 包部包要用绝对路径;项目内部包对相对路径。
- 工具goimport,帮我们自动引包,并格式化
goimport自动引包时,当两外包名一样时,会引起错误,需要自己注意
import (
"fmt"
)
- 多行包的组织方式
import (
"encoding/json"
"strings"
"myproject/models"
"myproject/controller"
"myproject/utils"
"github.com/astaxie/beego"
"github.com/go-sql-driver/mysql"
)
类型转换
- golang是强制类型转换,不支持隐式类型转换。
- int和int32以及int64在go中会被视为不同类型
错误处理
- 原则:不能丢弃任何有返回err的调用,不要使用 _ 丢弃,必须全部处理接收到错误,要么返回err,或者使用log记录下来
- 尽早return:一旦有错误发生,马上返回
- 尽量不要使用panic,除非你知道你在做什么
- 错误描述如果是英文必须为小写,不需要标点结尾
- 采用独立的错误流进行处理
// 错误写法
if err != nil {
// error handling
} else {
// normal code
}
// 正确写法
if err != nil {
// error handling
return // or continue, etc.
}
// normal code
常用工具
golint
代码规范检查工具,一般公司开发环境会限制只有通过golint检查的代码才可以发布
gofmt
gofmt 自动格式化代码,保证所有的 go 代码与官方推荐的格式保持一致
goimport
go get golang.org/x/tools/cmd/goimports
go vet
静态分析源码存在的各种问题,例如多余的代码,提前return的逻辑,struct的tag是否符合标准等。
go get golang.org/x/tools/cmd/vet
filewatcher插件
ideal的filewatcher插件,在保存时会自动格式化代码