📜  Golang 的包裹

📅  最后修改于: 2021-10-25 02:32:53             🧑  作者: Mango

包是 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]