ZetCode

Go 包

最后修改时间 2024 年 4 月 11 日

在本文中,我们将介绍如何在 Golang 中使用包。

是一个文件集合,其中声明了属于该包的常量、类型、变量和函数。

一个包的所有源文件都位于同一个目录下。每个源文件都以一个包子句开头,定义了它所属的包。属于一个包的常量、类型、变量和函数在该包的所有文件中都是可访问的。在需要时,包的元素可以导出到其他包。

一个包的所有源文件都存储在同一个目录中。目录名和包名不必匹配,但通常情况下两者共享相同的名称。

为了在另一个包中使用一个包的元素,这些元素必须是导出的。在 Go 中,导出是通过将元素的名称大写来实现的。

包具有以下目的

包进一步组织成模块。模块是存储在文件树中,并在其根目录有一个 go.mod 文件的 Go 包的集合。模块路径是用于导入该模块所有包的 것입니다。

Go main 包

main 包告诉 Go 编译器该包应编译为可执行程序而不是共享库。main 包中的 main 函数是程序的入口点。

simple.go
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

创建了一个模块。

helpers.go
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 文件,其中包含两个常量和两个函数。

main.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

这是项目目录的内容。

helpers/helpers.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 中,当元素的名称以大写字母开头时,就会发生导出。在我们的例子中,函数 F1F2 被导出。

main.go
package main

import (
     "com.zetcode/custom/helpers"
)

func main() {

     helpers.F1()
     helpers.F2()
}

我们调用了这两个函数。

import (
     "com.zetcode/custom/helpers"
)

请注意,我们用模块路径为包名加上前缀。

Go 包别名

为了防止名称冲突或为了方便,可以为包设置别名。

main.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 包,该包用于处理日期和时间。

main.go
package main

import (
    "fmt"

    "github.com/bykof/gostradamus"
)

func main() {

    now := gostradamus.Now()

    fmt.Println(now)
}

该示例打印当前时间。

来源

The Go Programming Language Specification

在本文中,我们讨论了 Go 中的包。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面有十多年的经验。

列出所有 Go 教程