# 包/package
# 概念
在 Go 语言中,package 是一个基础概念,通常会把某些相关逻辑写在一个包中。一个项目由多个包组件,由此实现代码的拆分。在 Go 中没有“类”的概念,package 在某种程度上取代了“类”的角色。
在所有的go代码中,都需要在最开头声明当前包的名字。
// 定义一个包main
package a
# 引用package
我们可以在一个package中引用另一个package,关键字为import。
// 引用fmt包
import "fmt"
Go 在引用包时,寻找的路径如下:
- 先是在$GOROOT/src路径下寻找
- 如果找不到,就到当前项目中的vendor路径下寻找
- 最后到到$GOPATH/src路径下寻找
# 调用包的方法
在package中,我们可以用关键字func声明函数。但函数的名称以大写开头时,这个函数就可以被引用他的人用到,此时这个函数也叫方法。
// 假设有一个package person
package person
// 声明Run为方法
func Run(){}
// 声明say为内部函数
func say(){}
此时如果我们引用了person
package main
import "person"
func main(){
// 没问题
person.Run()
// 编译报错
person.say()
}
# 更多引用的写法
# 引用多个包
在引用多个package时,我们可以用括号包起来
import (
"a"
"b"
"c"
)
# 别名引用
当包名出现重复时,可以为包定义一个别名,为包名定义别名后对于该引用包的调用全都改用别名。
// 定义一个包A
package a
// 为引用包c/a定义一个别名pkgA
import (
pkgA "c/a"
)
// 定义一个A方法,调用别名为pkgA的包c/a中的方法Test()
func A(){
pkgA.Test()
}
# 匿名引用
当包名出现重复时,除了为引用的包定义别名外,还可以使用关键字.,对于引用包的调用无需再指定包名。
// 定义一个包A
package a
// 引用包c/a,并忽略其包名
import (
. "c/a"
)
// 定义一个A方法,调用包c/a中的方法Test()
func A(){
Test()
}
# package初始化
除了前面提过的main,在package中还有一个特殊的函数init。在引用包时,会首先执行init方法,因此该方法一般用于除了一些初始化逻辑。
// 定义包a
package a
import (
"fmt"
)
// 定义包初始化方法,在别的包引用到包a时,会首先执行该方法
func init() {
fmt.Println("Initialize the package here")
}
# 初始化引用
如果你只想执行一下package的初始化方法,没有引用到其他。你可以用关键字_,声明只调用初始化
// 引用包c/a,只调用到其中的init()方法
import (
_ "c/a"
)