1. golang 工具与规范
1.1 格式化
如果想要团队项目中所有人都遵循相同的代码规范,可以使用 go fmt 格式化你的代码(比如说代码自动对齐、注释对齐。简直是造福了我这种强迫症)
1.2 注释
go语言支持块注释 /* */ 和 行注释 //
1.3 文档
go 语言可以为你的源码自动生成文档,而仅需你在写注释的时候遵循一定的规则:
1. 查看 doc 的方式有两种:
- godoc -http:=8080(将运行一个web服务器,在浏览器中输入 localhost:8080 即可浏览)
- package_name go doc(将在终端直接输出 package_name 的 doc)
2. 注释应该直接加在声明前,其之间不能存在空行。
3. 距离注释符 2 个以上空格的内容将被看做代码块
4. 一个例子如下:
// hello 包是用于演示 go doc 工具的一个包
// (package的注释将作为package的摘要和Overview)
// 距离注释符两个空格以上的距离的内容在 doc 中被解释为代码块
// 而距离注释符0个或1个空格则是普通的一行
// 还需要说明的是,doc 的生成是以包为单位的,而不是单个go文件。
package hello
import "fmt"
// Struct01 这是一个结构体
type Struct01 struct{
var01 int // 私有的变量不会展现在 doc 中
Var02 int // 公共的变量将展现在 doc 中
}
// 这是一个错误的范例,注释和函数声明之间存在一个空行,将无法为TestFunc01生成文档
func TestFunc01() {
}
// TestFunc02 该函数实现了***功能(此行将作为摘要)
// 这一行可以写函数的详细介绍(只有注释紧接着声明,注释才会被整理到Doc中)
func TestFunc02() {
fmt.Println("")
}
// TestFunc03 该函数实现了***功能
// 这一行可以写函数的详细介绍()
// 那么这一行呢?
func TestFunc03() (flag bool){
fmt.Println("")
return true
}
运行 godoc -http:=8080 后将在浏览器中输入 localhost:8080/pkg 将看到本机所有的 doc:
[浏览 localhost:8080]
1.4 包
1.4.1 包引用
- 绝对路径引用。go 会自动在 GOROOT(安装go后自动生成,即 go 的安装目录) 和 GOPATH(自己在环境变量中配置,类似 java 的 CLASSPATH) 下寻找你要引用的包。例如hex(16进制转换包)包在 go 源码中的目录路径是:src/pkg/encoding/hex,那么在项目中的引用方式是:
import "encoding/hex"
- 相对路径引用。以当前文件位置为起点。不建议使用这种引用方式。
import "../model" // 引用同一目录下的 model 包
- 点引用。使用点引用的包在调用包内函数时可以省略包名(易造成冲突,不推荐)
import . "fmt"
Println("这样就可以直接引用 Println() 函数而不需要使用 fmt. 前缀了")
- 别名引用。顾名思义。
import f "fmt"
f.Println("使用 f 这个别名来代替 fmt 这个别名")
- _引用。import 包时首先会执行包中的 init() 函数,其次我们就可以使用 '包名.函数名’来引用包中的内容,有时候我们仅仅想引用包中的 init() 函数,但并不需要用到包中的内容,此时就可以用 ‘_’ 引用。需要注意的是,使用 ‘_’ 的包无法调用该包中的内容。
import _ "fmt"
- ’打包’引用。一次性 import 多个包
import (
"fmt"
"math"
)
1.4.2 关于包的其他知识
- 同一个包下的 go 文件中的内容可以相互调用(唯一的特例是 main 包,如果 main 包下有多个文件,且在 main 方法中调用了 main 包下其他 go 文件中的方法,则需要 go run *.go 才能运行)
1.5 命名规范(官方推荐)
golang 中包、函数等等的官方命名规范。养成良好的命名规范对代码的质量有很强的提升作用。
1. 包名
包名小写,不建议在包名中使用下划线和驼峰记法
2. getter 和 setter
golang 中没有类的说法,但我们可以借鉴面向对象思想中的封装,将所有字段设为 private,然后按照情况提供 getter 和 setter。推荐的 getter 即字段名首字母大写即可,setter 即 'Set字段名’即可。
<!--
type User struct{
name string
}
-->
user := new model.User()
// getter 方法,字段首字母大写即可
func Name()(string){
return user.name
}
// setter 方法,'Set字段名'即可
func SetName(name){
user.name = name
}
3. 分号
在编程过程中分号可写可不写,但是进行编译时,go 的词法分析器将会自动为你的代码插入分号。
- 【注意】控制结构(if、for、switch、select)的左大括号不能放在下一行(否则会在大括号之前插入一条分号)
// 正确
if i < j {
}
// 错误
if i < j
{ // 左大括号不能在下一行
}
4. 接口名
约定,只包含一个方法的接口应当以该方法的名称加上-er后缀来命名,如 Reader、Writer、 Formatter、CloseNotifier 等。