在工程化的Go语言开发项目中,Go语言的源码复用是创建在包(package)基础之上的。本文介绍了Go语言中如何定义包、如何导出包的内容及如何导入其余包。git
包(package)
是多个Go源码的集合,是一种高级的代码复用方案,Go语言为咱们提供了不少内置包,如fmt
、os
、io
等。github
咱们还能够根据本身的须要建立本身的包。一个包能够简单理解为一个存放.go
文件的文件夹。 该文件夹下面的全部go文件都要在代码的第一行添加以下代码,声明该文件归属的包。函数
package 包名
注意事项:code
-
符号。若是想在一个包中引用另一个包里的标识符(如变量、常量、类型、函数等)时,该标识符必须是对外可见的(public)。在Go语言中只须要将标识符的首字母大写就可让标识符对外可见了。blog
举个例子, 咱们定义一个包名为pkg2
的包,代码以下:接口
package pkg2 import "fmt" // 包变量可见性 var a = 100 // 首字母小写,外部包不可见,只能在当前包内使用 // 首字母大写外部包可见,可在其余包中使用 const Mode = 1 type person struct { // 首字母小写,外部包不可见,只能在当前包内使用 name string } // 首字母大写,外部包可见,可在其余包中使用 func Add(x, y int) int { return x + y } func age() { // 首字母小写,外部包不可见,只能在当前包内使用 var Age = 18 // 函数局部变量,外部包不可见,只能在当前函数内使用 fmt.Println(Age) }
结构体中的字段名和接口中的方法名若是首字母都是大写,外部包能够访问这些字段和方法。例如:开发
type Student struct { Name string //可在包外访问的方法 class string //仅限包内访问的字段 } type Payer interface { init() //仅限包内访问的方法 Pay() //可在包外访问的方法 }
要在代码中引用其余包的内容,须要使用import
关键字导入使用的包。具体语法以下:编译器
import "包的路径"
注意事项:源码
$GOPATH/src/
后开始计算的,使用/
进行路径分隔。单行导入的格式以下:string
import "包1" import "包2"
多行导入的格式以下:
import ( "包1" "包2" )
在导入包名的时候,咱们还能够为导入的包设置别名。具体语法格式以下:
import 别名 "包的路径"
单行导入方式定义别名:
import "fmt" import m "github.com/Q1mi/studygo/pkg_test" func main() { fmt.Println(m.Add(100, 200)) fmt.Println(m.Mode) }
多行导入方式定义别名:
import ( "fmt" m "github.com/Q1mi/studygo/pkg_test" ) func main() { fmt.Println(m.Add(100, 200)) fmt.Println(m.Mode) }
若是只但愿导入包,而不使用包内部的数据时,可使用匿名导入包。具体的格式以下:
import _ "包的路径"
匿名导入的包与其余方式导入的包同样都会被编译到可执行文件中。
在Go语言程序执行时导入包语句会自动触发包内部init()
函数的调用。须要注意的是: init()
函数没有参数也没有返回值。 init()
函数在程序运行时自动被调用执行,不能在代码中主动调用它。
包初始化执行的顺序以下图所示:
Go语言包会从main
包开始检查其导入的全部包,每一个包中又可能导入了其余的包。Go编译器由此构建出一个树状的包引用关系,再根据引用顺序决定编译顺序,依次编译这些包的代码。
在运行时,被最后导入的包会最早初始化并调用其init()
函数, 以下图示: