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 中的包。