Go 语言中的包
在 Go 语言的错误处理中我们提到了 errors 包,当时没有详细的介绍。本文就来详细的介绍一下 Go 语言中包相关的概念。
和大部分语言一致,Go 语言也是支持调用其它文件中的 Go 代码的。Go 语言是现这一功能则是通过包来实现的。而实现包的功能则是通过关键字 package 来实现的,使用 package 来声明代码所在的包。
1. 基本概念
Go 语言中一般使用文件所在的文件名来命名自己的包名,这样层次清晰便于管理。其中包名定义的注意事项如下:
- 包名一般都是全小写;
- 包名不可以是路径;
- 一个文件夹下只能有一个包名;
- 每个程序的入口包名均为 main,只有有 main 包,程序才可以执行。
2. 包的导入
现在的编译器一般都会帮开发者做掉导包这个功能,但是我们还是要了解一下如何导入一个包,使之可以在程序中使用。我们导入包需要用到一个叫 import 的关键字。
2.1 单行导入
可以使用形如import 包所在路径
的方式导入我们想要导入的包,其中包的路径可以使用两种方式来表示:
- 相对路径:即你的目标包和你当前代码的相对路径。
- 绝对路径:即
$GOPATH/src
和$GOROOT/src
之后的路径。
代码示例
import firstgo/packagetest1
import ../packagetest2
- 第 1 行:使用绝对路径导入 packagetest1 这个包;
- 第 2 行:使用相对路径导入 packagetest2 这个包。
2.2多行导入
多行导入的方式有点类似于多个常量同时定义。
代码示例:
import (
firstgo/packagetest1
firstgo/packagetest2
)
3. 使用规则
在 Go 语言中,并不是直接导入了你写的一个包,你就可以直接使用包中的任何代码。这里有一个类似于Java和.NET的私有和公有的概念,你只可以使用导入的包中的公有的函数、变量以及自定义类型。Go 语言中区分公有私有的方法很简单,就是查看函数名、变量名以及自定义类型名的首字母是否为大写,大写的即为公有,小写的为私有。
代码示例:
package packagetest1
import "fmt"
//定义私有变量name
var name = "Test1"
//PrintName 打印变量name
func PrintName() {
fmt.Println("packagetest1 Name:", name)
}
package packagetest2
import "fmt"
//定义私有变量name
var name = "Test2"
//PrintName 打印变量name
func PrintName() {
fmt.Println("packagetest2 Name:", name)
}
package main
import (
"firstgo/packagetest1"
"firstgo/packagetest2"
)
func main() {
packagetest1.PrintName()//调用这个包中的PrintName()函数
packagetest2.PrintName()//调用这个包中的PrintName()函数
}
执行结果:
你在开发 main 包的代码时你会发现,你只能使用导入包中的 PrintName() 函数,而不能使用包中的 name 变量。就是因为函数的首字母是大写,而变量的首字母是小写。
4. 小结
本文主要介绍了 Go 语言中代码复用的方法。其中引入了包的概念,需要注意有以下两个规则:
-
包名的命名规则:
-
- 包名一般都是全小写;
- 包名不可以是路径;
- 一个文件夹下只能有一个包名;
- 每个程序的入口包名均为 main ,只有有 main 包,程序才可以执行。
-
包中公有和私有的判定规则:公有首字母大写,私有首字母小写。