Golang 包
包是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"
这里,数学包是主包,cmplx包是嵌套包。
6. 有时一些包可能有相同的名字,但这种类型的包的路径总是不同。例如,数学包和密码包都包含一个名为rand的包,但这个包的路径不同,即math/rand和crypto/rand。
7. 在Go编程中,为什么主包总是出现在程序的顶部?因为主包告诉go build,它必须激活链接器来制作一个可执行文件。
给包起名
在Go语言中,当你为一个包命名时,你必须始终遵循以下几点。
- 当你创建一个包的时候,包的名字必须是简短的。例如strings, 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]