一、包的概念
go语言程序都是由包构成的,如我们前面文章提到过的 package main
,定义了名为 main 的包,以及代码 import "fmt"
导入名为 fmt
的包。又如代码 fmt.Println()
则是调用了fmt
包中的Println
函数。
二、包的定义
定义包的语句我们已经介绍很多次了
package main
三、包的导入
分别导入
import "fmt"
import "math"
分组导入
import(
"fmt"
"math"
)
四、自定义包
我们试着创建一个包文件 pack.go 存放在目录 pack 下。pack.go 代码如下
package pack
import (
"fmt"
)
func SayHi() {
fmt.Println("hi")
}
然后我们编译这个包
$ cd your_path/pack
$ pack go install
编译成功我们将在 $GOPATH/pkg 目录下找到我们自定义的包。如我的目录 $GOPATH/pkg/learn-go/001/pack
接着我们在项目中引用我们的pack
包
package main
import "learn-go/001/pack"
func main() {
pack.SayHi()
}
注意,按照惯例包名与导入路径的最后一个目录一致,如上面的 learn-go/001/pack 最后一个目录为 pack
,我们的包名也是 pack
五、包的导出名
在我们导入了某个包之后,我们可以通过导出名来调用其中的函数,访问其成员。如上面的代码 pack.SayHi()
.值得注意的是,Golan 规定只有首字母大写的成员才可被外界访问。也就是说如果我们 pack.go
中的 SayHi
函数如果改为 sayHi
,我们将无法进行访问该函数,相比于其他语言,Golang这样处理直接可以省略访问修饰符,如有些语言的 private
和 public
证明如下,修改 pack.go 代码如下
package pack
import (
"fmt"
)
//首字母改为小写
func sayHi() {
fmt.Println("hi")
}
重新编译 pack 包
$ cd your_path/pack
$ pack go install
运行我们的程序,结果如下
package main
import "learn-go/001/pack"
func main() {
pack.sayHi()
}
./hello.go:6:2: cannot refer to unexported name pack.sayHi
./hello.go:6:2: undefined: pack.sayHi