Go 包
最后修改时间 2024 年 4 月 11 日
在本文中,我们将介绍如何在 Golang 中使用包。
包 是一个文件集合,其中声明了属于该包的常量、类型、变量和函数。
一个包的所有源文件都位于同一个目录下。每个源文件都以一个包子句开头,定义了它所属的包。属于一个包的常量、类型、变量和函数在该包的所有文件中都是可访问的。在需要时,包的元素可以导出到其他包。
一个包的所有源文件都存储在同一个目录中。目录名和包名不必匹配,但通常情况下两者共享相同的名称。
为了在另一个包中使用一个包的元素,这些元素必须是导出的。在 Go 中,导出是通过将元素的名称大写来实现的。
包具有以下目的
- 组织代码以供重用
- 防止名称冲突
- 通过允许重新编译程序的较小块来加快编译器速度
包进一步组织成模块。模块是存储在文件树中,并在其根目录有一个 go.mod 文件的 Go 包的集合。模块路径是用于导入该模块所有包的 것입니다。
Go main 包
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
Go 自定义包
在下面的示例中,我们创建一个自定义包。
$ 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 拥有庞大的第三方库生态系统,它们以包的形式分发。
要包含一个包,我们导入它,Go 会在我们构建或运行项目时自动下载它。或者,我们可以使用 go get 命令手动下载它。
$ 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)
}
该示例打印当前时间。
来源
The Go Programming Language Specification
在本文中,我们讨论了 Go 中的包。