目录
1. 代码基本结构
Go 程序的执行(程序启动)顺序如下:
- 按顺序导入所有被 main 包引用的其它包,然后在每个包中执行如下流程:
- 如果该包又导入了其它的包,则从第一步开始递归执行,但是每个包只会被导入一次。
- 然后以相反的顺序在每个包中初始化常量和变量,如果该包含有 init 函数的话,则调用该函数。
- main 也执行同样的过程(初始化常量变量,调用init函数),最后调用 main 函数开始执行程序。
//包声明
package [pkg]
//导入其他包
import (
[pkg1]
[pkg2]
...
)
//类型声明
type (
[t1 type1]
[t2 type2]
...
)
//常量声明
const (
[const1 = value1]
[const2 = value2]
...
)
//变量声明
var (
[name1 type1]
[name2 type2]
...
)
//函数定义
func func1() {
//todo
}
hello world
package main
import "fmt"
func main() {
fmt.Println("hello, world")
}
2. package 以及 import
包(package)
go用来结构化代码的一种方式,可参考其他语言中的类库或命名空间的概念。
每个程序都由包组成,可以使用自身包或者从导入其它包中的内容。
每个 .go 文件都属于且仅属于一个包,一个包可以包含多个 .go 文件
1. 所有的包名都应该使用小写字母。
2. 必须在源文件中非注释的第一行指明这个文件属于哪个包,如:package main。
3. package main表示一个可独立执行的程序,每个 Go 应用程序都包含一个名为 main 的包
标准库
在 Go 的安装文件里包含了一些可以直接使用的包(标准库),标准库一般存放在 $GOROOT/pkg/$GOOS_$GOARCH/ 目录下。
编译
1. 包是编译的最小单元,因此根据惯例,每个目录都只包含一个包。
2. 如果对一个包进行更改或重新编译,所有引用了这个包的客户端程序都必须全部重新编译。
Go 中的包模型采用了显式依赖关系的机制来达到快速编译的目的,编译器会从后缀名为 .o 的对象文件(需要且只需要这个文件)中提取传递依赖类型的信息。每一段代码只会被编译一次
如果 A.go
依赖 B.go
,而 B.go
又依赖 C.go
:
- 编译
C.go
,B.go
, 然后是A.go
.- 为了编译
A.go
, 编译器读取的是B.o
而不是C.o
.
这种机制对于编译大型的项目时可以显著地提升编译速度。
导入(import)
一个 Go 程序是通过 import
关键字将一组包链接在一起。
import (
"fmt"
"os"
)
导入的包以 . 或 / 开头可以指定路径(相对路径/绝对路径),否则会在全局文件进行查找。
可参考 c/c++ 的头文件引用 #include <header.h> #include "header.h"
可见性
当标识符(包括常量、变量、类型、函数名、结构字段等等)以大写字母开头,可以被导出(对包外部可见:参考其他面向对象的 public 属性), 否则不可以被导出(对包外部不可见:参考其他面向对象的 private 属性)
在包内部声明的标识符(包括常量、变量、类型、函数名、结构字段等等)在包内部是可见的,即使不是在同一个文件中。