Go 语言结构
包声明、导入、函数、以及一个 Go 文件的最小骨架。
Key Points`package main` + `func main()` 才是可执行程序;其他包名只能被导入。
骨架
Go
// 1. 包声明:这一行必须是文件第一行(注释除外)
package main
// 2. 导入
import (
"fmt"
"os"
)
// 3. 常量、变量、类型
const Version = "1.0.0"
// 4. 函数
func main() {
fmt.Println("版本", Version)
fmt.Println("参数", os.Args[1:])
}Bash
go run main.go a b cOutput
版本 1.0.0
参数 [a b c]每一部分的作用
| Part | Rule |
|---|---|
package | 必须有,且同目录下所有文件包名一致 |
import | 导入后必须使用,否则编译失败 |
main | 只有 package main 里的 main() 是入口 |
| 大小写 | 大写开头 = 导出(public),小写 = 包内私有 |
导入的几种写法
Go
import "fmt" // 单个
import ( // 分组
"fmt"
"strings"
)
import f "fmt" // 起别名
import _ "github.com/lib/pq" // 只执行 init(),不直接使用
import . "fmt" // 并入当前命名空间(不推荐)Blank imports are most common for driver registration: database/sql knows nothing about PostgreSQL — lib/pq's init() registers the driver.
多文件同包
Text
hello/
├── go.mod
├── main.go package main
├── greet.go package main ← 同一个包,可直接互相调用
└── util/
└── util.go package util ← 另一个包,需导入Go
// greet.go
package main
import "fmt"
func greet(name string) { // 小写,包内可见
fmt.Println("你好,", name)
}Go has no class files — a directory is a package. Two different package names in one directory is a compile error, quite unlike Java packages.
骨架
Go
// 1. 包声明:这一行必须是文件第一行(注释除外)
package main
// 2. 导入
import (
"fmt"
"os"
)
// 3. 常量、变量、类型
const Version = "1.0.0"
// 4. 函数
func main() {
fmt.Println("版本", Version)
fmt.Println("参数", os.Args[1:])
}Bash
go run main.go a b cOutput
版本 1.0.0
参数 [a b c]每一部分的作用
| 部分 | 规则 |
|---|---|
package | 必须有,且同目录下所有文件包名一致 |
import | 导入后必须使用,否则编译失败 |
main | 只有 package main 里的 main() 是入口 |
| 大小写 | 大写开头 = 导出(public),小写 = 包内私有 |
导入的几种写法
Go
import "fmt" // 单个
import ( // 分组
"fmt"
"strings"
)
import f "fmt" // 起别名
import _ "github.com/lib/pq" // 只执行 init(),不直接使用
import . "fmt" // 并入当前命名空间(不推荐)_ 空导入最常用于驱动注册:database/sql 不认识 PostgreSQL,是 lib/pq 的 init() 把驱动注册进去的。
多文件同包
Text
hello/
├── go.mod
├── main.go package main
├── greet.go package main ← 同一个包,可直接互相调用
└── util/
└── util.go package util ← 另一个包,需导入Go
// greet.go
package main
import "fmt"
func greet(name string) { // 小写,包内可见
fmt.Println("你好,", name)
}Go 没有「类文件」的概念,目录就是包。同一个目录下不能有两个不同的包名,这一点和 Java 的包机制差别很大。