Packages

每一个 go 程序都是有包(packages)组成的。
程序的执行是从main包开始的。
如:

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	fmt.Println("My favorite number is", rand.Intn(10))
}

要使用包,只需使用 import 导入包的路径(paths of "fmt" and "math/rand"))即可

按照惯例,包名与导入路径的最后一个元素相同。

例如,“math/rand”包包含以语句package rand开头的文件。

Imports

我们知道 import 可以导入包。
如果同时导入多个包,可以使用 因式分解导入语句(factored import statement),即包含在一个括号中。

import (
	"fmt"
	"math"
)

// 等价
import "fmt"
import "math"

推荐使用 the factored import statement.

为什么叫“factored” 呢? 是不是有点类似初中数学中的因式分解法。
This is the same as ab+ac=a(b+c), which is called factoring.

Exported names

在 Go 中,如果名称以大写字母开头,则导出名称。
导入包时,只能引用其导出的名称。
任何“未导出”的名称都不能从包外部访问。

package main

import (
	"fmt"
	"math"
)

func main() {
    // 报错: undefined: math.pi
    // To fix the error, rename math.pi to math.Pi and try it again.
	fmt.Println(math.pi)
}

Functions

函数可以接受一个或多个参数,参数名称紧跟参数类型。
函数名称后面要指定函数返回值的类型。

// 定义一个函数,两个int类型的参数,返回值为int类型
func add(x int, y int) int {
	return x + y
}

如果多个连续的命名参数,类型相同,可以省略除最后一个以外的所有类型。

func add(x, y int) int {
	return x + y
}

函数也可以有多个返回值。

func swap(x, y string) (string, string) {
	return y, x
}