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教程。
