开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
格式化
- 使用
go fmt命令将编程的格式问题(缩进、对齐等等)都交给 **gofmt **工具。
注释
- 使用
go doc命令提取包中的文档内容。提取的内容包括所有顶级声明以及声明前的注释(没有空行间隔)package xxx之前的是包注释;顶级声明之前的是文档注释,每个导出名都应该有文档注释
Go is a tool for managing Go source code.
Usage:
go <command> [arguments]The commands are:
bug start a bug report build compile packages and dependencies clean remove object files and cached files **doc show documentation for package or symbol** env print Go environment information fix update packages to use new APIs **fmt gofmt (reformat) package sources** generate generate Go files by processing source get add dependencies to current module and install them install compile and install packages and dependencies list list packages or modules mod module maintenance work workspace maintenance run compile and run Go program test test packages tool run specified go tool version print Go version vet report likely mistakes in packagesUse "go help " for more information about a command.
命名规则
- 包名:1) 一般以小写的单个单词命名,不使用下划线或驼峰命名法;2) 应为源码目录的base name。
- 包的导入者可以使用包名引用其中内容,这样可以:1) 利用包结构简化命名,例如采用
bufio.Reader而不是BuferReader;2) 避免冲突,例如bufio.Reader和io.Reader不会冲突。 - 获取器(getter)命名不加
Get前缀。例如owner字段的获取器可以是Owner,而设置器(setter)可以为SetOwner。 - 只包含一个方法的接口应当加上类似
-er的后缀构建一个代理名词,比如Reader。 Read/Write/Close/Flush/String方法都具有典型的签名和意义,除非你自己的实现与其他类型的意义一致,否则避免使用这些名字。- Go中使用
MixedCaps而不是mixedCaps组合多个单词的命名。
分号
- Go 的正式语法和 C 一样使用分号来结束语句,但这些分号并不在源码中出现。取而代之,词法分析器会使用规则来自动插入分号,因此源码中基本就不用分号了。
- 但例如 for 循环语句中还是会使用分号来将初始化器、条件及增量元素分开。如果在一行中写多个语句,也需要用分号隔开。
- 受词法分析器自动加分号的规则影响,控制结构如
if/for/switch/select的左大括号都不能放在下一行,这会导致在它前面加入额外的分号。
控制结构
- Go中的循环结构只有
for语句。 if和switch结构也可以使用初始化语句。- 一个新的控制结构
select。 - 没有圆括号,主体使用大括号。
- 某些条件下,已被声明的变量还可以出现在
:=声明中:- 本次声明与已有声明在同一作用域;
- 赋值类型与声明类型一致;
- 本次声明至少另有一个新声明的变量;
- 函数形参和返回值的作用域与函数体相同。
for循环的三种形式:for init; condition; post { }for condition { }for { }
- 在
for循环中使用range子句遍历数组、切片、字符串或map. - Go没有逗号操作符,使用多个变量应采用平行赋值。
for i, j := 0, len(a)-1; i < j; i, j = i+1, j-1 { }
switch表达式无需为整数,如果后面没有表达式,将匹配true。所以可以将if-else-if-else结构写成switch,更符合Go的风格。switch还可以通过类型选择判断接口变量的类型,如switch v := t.(type)。
函数
- 函数和方法可以返回多个值。
- 函数的返回值可以被命名,并在函数开始执行时被初始化为对应的零值,此时该函数可以执行不带值的
return语句。 defer推迟的函数会立即求值(实参、接收者),而在它的包围函数返回后(return语句之后)执行,所以可能会修改命名返回值。
补充一点: Go的函数参数都是值传递而非引用传递。但实际有一些微妙的区别:
- 如 int, string, struct 等类型因为值传递,所以函数中无法修改原值;
- 如 slice, chan, map, 指针等类型实际是指针的值传递,所以函数可以修改原值。