Go包教程展示了如何在Golang中使用包。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
包是声明常量、类型、变量和属于包的函数的文件集合。
一个包的所有源文件都位于一个目录中。每个源文件都以一个包子句开始,该子句定义了它所属的包。属于一个包的常量、类型、变量和函数在该包的所有文件中都是可访问的。包的元素可以在需要时导出到其他包。
包的所有源文件都存储在一个目录中。目录和包的名称不必匹配,但通常的做法是两者共享相同的名称。
为了在另一个包中使用一个包的元素,必须导出这些元素。在Go中,导出是通过将元素名称大写来执行的。
包有以下用途:
- 组织代码以供重用
- 防止名称冲突
- 通过允许重新编译较小的程序块来加快编译速度
包被进一步组织成模块。模块是存储在文件树中的Gopackage的集合,其根部有一个go.mod
文件。模块路径是用于导入该模块所有包的前缀路径。
进入主包
包main
告诉Go编译器该包应该编译为可执行程序而不是共享库。main包中的main函数是程序的入口。
package main import "fmt" func main() { fmt.Println("Hello there!") }
程序定义了一个main
包,并从fmt
包中导入了一个函数。
package main
我们声明main
包。包是用package
关键字声明的。
import "fmt"
我们导入fmt
包;它实现了格式化的输入/输出。
fmt.Println("Hello there!")
我们现在可以使用fmt
包的Println
函数了。
所有文件、变量和类型都可以在同一包内的所有文件中访问。以下两个文件共享同一个包。
$ go mod init com.zetcode/main
创建了一个模块。
package main import "fmt" const c1 = 1.2 const c2 = 1.4 func f1() { fmt.Println("f1") } func f2() { fmt.Println("f2") fmt.Println(c1) fmt.Println(c2) }
我们有包含两个常量和两个函数的helpers.go
文件。
package main import "fmt" func main() { f1() f2() fmt.Println("-----------------") fmt.Println(c1) fmt.Println(c1) }
我们可以直接调用这两个函数并打印这两个常量,而无需导入它们。
$ go run . f1 f2 1.2 1.4 ----------------- 1.2 1.2
去自定义包
在下面的示例中,我们创建了一个自定义包。
$ mod init com.zetcode/custom
首先,我们创建一个模块。
$ tree âââ go.mod âââ helpers â  âââ helpers.go âââ main.go
这些是项目目录的内容。
package helpers import "fmt" const c1 = 1.2 const c2 = 1.4 func F1() { fmt.Println("f1") } func F2() { fmt.Println("f2") fmt.Println(c1) fmt.Println(c2) }
为了将一个包中的元素暴露给另一个包,我们必须导出它们。在Go中,导出是在元素名称以大写字母开头时完成的。在我们的例子中,函数F1
和F2
被导出。
package main import ( "com.zetcode/custom/helpers" ) func main() { helpers.F1() helpers.F2() }
我们调用这两个函数。
import ( "com.zetcode/custom/helpers" )
请注意,我们在包名称前加上模块路径。
Go包别名
为了防止名称冲突或为了方便起见,可以给包起别名。
package main import ( "fmt" str "strings" ) func main() { langs := []string{"F#", "Go", "Python", "Perl", "Erlang"} s := str.Join(langs, ", ") fmt.Println(s) data := str.Split(s, ",") fmt.Println(data) }
在代码示例中,我们使用了strings
包并为其指定了一个别名。
import ( "fmt" str "strings" )
我们给strings
包一个新的别名,叫做str
。
s := str.Join(langs, ", ")
我们通过别名引用Join
函数。
去第三方包
Go拥有庞大的第三方库生态系统,这些库以包的形式分发。
为了包含一个包,我们导入它,Go在我们构建或运行项目时自动下载它。或者我们可以使用goget
命令手动下载。
$ go mod init com.zetcode/thirdparty $ go get github.com/bykof/gostradamus
我们启动一个模块并下载用于处理日期和时间的gostradamus
包。
package main import ( "fmt" "github.com/bykof/gostradamus" ) func main() { now := gostradamus.Now() fmt.Println(now) }
该示例打印当前时间。
在本教程中,我们讨论了Go中的包。
列出所有Go教程。