包是 Go 语言中最强大的部分。包的目的是通过将相关功能组合成单个单元来设计和维护大量程序,以便它们易于维护和理解并独立于其他包程序。这种模块化允许他们共享和重用。在 Go 语言中,每个包都定义了一个不同的名称,这个名称接近于它们的功能,如“字符串”包,它包含只与字符串相关的方法和函数。
要点
1. 导入路径:在 Go 语言中,每个包都由一个唯一的字符串定义,这个字符串称为导入路径。借助导入路径,您可以在程序中导入包。例如:
import "fmt"
此语句说明您正在程序中导入 fmt 包。包的导入路径是全局唯一的。为避免标准库以外的包路径发生冲突,包路径应以拥有或托管包的组织的互联网域名开头。例如:
import "geeksforgeeks.com/example/strings"
2.包声明:在Go语言中,包声明总是出现在源文件的开头,这个声明的目的是确定该包被另一个包导入时的默认标识符。例如:
package main
3. 进口声明:进口声明紧跟在包声明之后。 Go 源文件包含零个或多个导入声明,每个导入声明在括号中指定一个或多个包的路径。例如:
// Importing single package
import "fmt"
// Importing multiple packages
import(
"fmt"
"strings"
"bytes"
)
当您在程序中导入包时,您可以访问该包的成员。例如,我们有一个名为“sort”的包,因此当您在程序中导入该包时,您可以访问该包的 sort.Float64s()、sort.SearchStrings() 等函数。
4.空白导入:在Go编程中,有时我们会在我们的程序中导入一些包,但我们并没有在我们的程序中使用它们。当您运行包含未使用包的此类程序时,编译器将给出错误。所以,为了避免这个错误,我们在包名前使用了一个空白标识符。例如:
import _ "strings"
它被称为空白导入。它用于许多或某些场合,当主程序可以在编译时启用空白导入附加包提供的可选功能。
5.嵌套包:在Go语言中,你可以通过创建一个子目录来在另一个包中创建一个包。并且嵌套包可以像根包一样导入。例如:
import "math/cmplx"
在这里,math 包是主包,cmplx 包是嵌套包。
6.有时有些包可能有相同的名称,但此类包的路径总是不同的。例如,math 和 crypto 包都包含一个名为 rand 的包,但是这个包的路径不同,即 math/rand 和 crypto/rand。
7.在 Go 编程中,为什么 main 包总是出现在程序的顶部?因为 main 包告诉 go build 它必须激活链接器才能生成可执行文件。
给包命名
在 Go 语言中,当你命名一个包时,你必须始终遵循以下几点:
- 创建包时,包的名称必须简短。例如字符串, time , flag 等都是标准库包。
- 包名称应该是描述性的且明确的。
- 始终尽量避免选择常用或用于局部相对变量的名称。
- 包名一般采用单数形式。有时一些包以复数形式命名,如字符串、字节、缓冲区等。因为避免与关键字冲突。
- 始终避免已经具有其他含义的包名称。例如:
例子:
// Go program to illustrate the
// concept of packages
// Package declaration
package main
// Importing multiple packages
import (
"bytes"
"fmt"
"sort"
)
func main() {
// Creating and initializing slice
// Using shorthand declaration
slice_1 := []byte{'*', 'G', 'e', 'e', 'k', 's', 'f',
'o', 'r', 'G', 'e', 'e', 'k', 's', '^', '^'}
slice_2 := []string{"Gee", "ks", "for", "Gee", "ks"}
// Displaying slices
fmt.Println("Original Slice:")
fmt.Printf("Slice 1 : %s", slice_1)
fmt.Println("\nSlice 2: ", slice_2)
// Trimming specified leading
// and trailing Unicode points
// from the given slice of bytes
// Using Trim function
res := bytes.Trim(slice_1, "*^")
fmt.Printf("\nNew Slice : %s", res)
// Sorting slice 2
// Using Strings function
sort.Strings(slice_2)
fmt.Println("\nSorted slice:", slice_2)
}
输出:
Original Slice:
Slice 1 : *GeeksforGeeks^^
Slice 2: [Gee ks for Gee ks]
New Slice : GeeksforGeeks
Sorted slice: [Gee Gee for ks ks]