内置关键字
均为小写,关键字不能作为标识符使用
break | default | func | interface | select |
---|---|---|---|---|
case | defer | go | map | struct |
chan | else | goto | package | switch |
const | fallthrough | if | range | type |
continue | for | import | return | var |
除了以上,还有一些预定义标识符
append | bool | byte | cap | close | complex | complex64 | complex128 | uint16 |
---|---|---|---|---|---|---|---|---|
copy | false | float32 | float64 | imag | int | int8 | int16 | uint32 |
int32 | int64 | iota | len | make | new | nil | panic | uint64 |
println | real | recover | string | true | uint | uint8 | uintptr |
程序的代码通过语句来实现结构化。每个语句不需要像 C 家族中的其它语言一样以分号
;
结尾,因为这些工作都将由 Go 编译器自动完成
Go 包
定义
每个Go文件都属于且仅属于一个包,一个包可以由许多以.go
为扩展名的源文件组成,因此文件名和包名一般来说都是不相同的。必须在源文件中非注释的第一行中指明该文件属于哪个包,package main
。package main
表示一个可独立执行的程序,每个Go应用程序都包含一个名为main
的包。所有的包名应该都是小写
如果想要构建一个程序,则包和包内的文件都必须以正确的顺序进行编译。包的依赖关系决定了其构建顺序。
属于同一个包的源文件必须全部被一起编译,一个包即是编译时的一个单元,因此根据惯例,每个目录都只包含一个包。
如果对一个包进行更改或重新编译,所有引用了这个包的客户端程序都必须全部重新编译。
Go 中的包模型采用了显式依赖关系的机制来达到快速编译的目的,编译器会从后缀名为 .o
的对象文件(需要且只需要这个文件)中提取传递依赖类型的信息。
如果 A.go
依赖 B.go
,而 B.go
又依赖 C.go
:
- 编译
C.go
,B.go
, 然后是A.go
. - 为了编译
A.go
, 编译器读取的是B.o
而不是C.o
.
导入
如果包名不是以 .
或 /
开头,如 "fmt"
或者 "container/list"
,则 Go 会在全局文件进行查找;如果包名以 ./
开头,则 Go 会在相对目录中查找;如果包名以 /
开头(在 Windows 下也可以这样使用),则会在系统的绝对路径中查找。
导入单个包:
1 | // 单个包 |
多个包
1 | // 多个 |
别名
1 | // 别名 alias |
省略
1 | // 省略调用,不建议使用 |
如果导入一个包没有是使用它,在构建程序时,会抛出错误
imported and not used: os
可见性规则
Go 语言中,使用大小写来决定该常量、变量、类型、接口、结构或函数是否可以被外部包所调用:
根绝约定,函数名首字母小写即为 private
,对包外不可见,在包内是可以可见并可用的
1 | func getField(i int) |
函数名首字母大写为 public
,被视为导出
1 | func Printf(i int) |
func 函数
main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数,如果有 init() 函数则会先执行该函数。
1 | // 当前程序的包名 |
输出:
1 | -- func init execute -- |
如果你的 main 包的源代码没有包含 main 函数,则会引发构建错误 undefined: main.main
。main 函数既没有参数,也没有返回类型(与 C 家族中的其它语言恰好相反)。如果你不小心为 main 函数添加了参数或者返回类型,将会引发构建错误:
1 | func main must have no arguments and no return values results. |
注释
几乎所有全局作用域的类型、常量、变量、函数和被导出的对象都应该有一个合理的注释。如果这种注释(称为文档注释)出现在函数前面,例如函数 Abcd,则要以 "Abcd..."
作为开头。
1 | // enterOrbit causes Superman to fly into low Earth orbit, a position |