Go 程序的基本结构和要素

内置关键字

均为小写,关键字不能作为标识符使用

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
print println real recover string true uint uint8 uintptr

程序的代码通过语句来实现结构化。每个语句不需要像 C 家族中的其它语言一样以分号 ; 结尾,因为这些工作都将由 Go 编译器自动完成

Go 包

定义

每个Go文件都属于且仅属于一个包,一个包可以由许多以.go为扩展名的源文件组成,因此文件名和包名一般来说都是不相同的。必须在源文件中非注释的第一行中指明该文件属于哪个包,package mainpackage 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
2
// 单个包
import "fmt"

多个包

1
2
3
4
5
6
7
8
9
// 多个
import "fmt"
import "os"

// 多个
import (
"fmt"
"os"
)

别名

1
2
3
4
5
6
7
8
// 别名 alias
import (
io "fmt"
)

func main(){
io.Println("123")
}

省略

1
2
3
4
// 省略调用,不建议使用
import . "fmt"

Println("1231132")

如果导入一个包没有是使用它,在构建程序时,会抛出错误imported and not used: os

可见性规则

Go 语言中,使用大小写来决定该常量、变量、类型、接口、结构或函数是否可以被外部包所调用:

根绝约定,函数名首字母小写即为 private,对包外不可见,在包内是可以可见并可用的

1
func getField(i int)

函数名首字母大写为 public,被视为导出

1
func Printf(i int)

func 函数

main 函数是每一个可执行程序所必须包含的,一般来说都是在启动后第一个执行的函数,如果有 init() 函数则会先执行该函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 当前程序的包名
package main

// 导入其他的包
import fm "fmt"

func init() {
fm.Println("-- func init execute --")
}

func main() {

// 输出
fm.Printf("Hello,Go\n你好,狗")
}

输出:

1
2
3
4
-- func init execute --
Hello,Go
你好,狗
Process finished with exit code 0

如果你的 main 包的源代码没有包含 main 函数,则会引发构建错误 undefined: main.main。main 函数既没有参数,也没有返回类型(与 C 家族中的其它语言恰好相反)。如果你不小心为 main 函数添加了参数或者返回类型,将会引发构建错误:

1
2
3
func main must have no arguments and no return values results.
或者
Run after build is not possible Main file has non-main package or doesn't contain main function

注释

几乎所有全局作用域的类型、常量、变量、函数和被导出的对象都应该有一个合理的注释。如果这种注释(称为文档注释)出现在函数前面,例如函数 Abcd,则要以 "Abcd..." 作为开头。

1
2
3
4
5
// enterOrbit causes Superman to fly into low Earth orbit, a position
// that presents several possibilities for planet salvation.
func enterOrbit() error {
...
}
- the End -
0%