「每週譯 Go」在 Go 中導入包


介紹

有時,你的代碼需要當前程序的基礎上增加更多的功能。在這些情況下,你可以使用軟件包來豐富你的程序。在 Go 中, 一個包表示磁盤上單個目錄中的所有文件。包可以定義可以在其他 Go 文件或包中引用的函數、類型和接口。

本教程將帶你來完成軟件包的安裝, 導入和重命名。

標準庫包

標準庫是 Go 附帶的一組軟件包。這些軟件包包含許多用於編寫現代軟件的基本模塊。例如, fmt 軟件包包含用於格式和打印字符串的基本功能。net/http 軟件包包含允許開發人員創建 Web 服務,通過HTTP 協議發送和檢索數據的功能,等等。

爲了利用軟件包中的功能,你需要使用 import 語句訪問軟件包。import 語句由 import 關鍵字以及軟件包的名稱組成。

例如,在 GO 程序中 random.go 文件。你可以導入 math/rand 包來生成隨機數:

import "math/rand"

當我們導入一個包時,我們把它在當前程序中作爲一個單獨 namespace 命名空間來使用。這意味着我們必須像 package.function 調用其中的函數。

實際上,math/rand 軟件包的功能看起來像這些示例:

讓我們創建一個 for 循環,以顯示我們如何在隨機過程中調用 math/rand 軟件包的函數。

random.go

package main

import "math/rand"

func main() {
  for i := 0; i < 10; i++ {
    println(rand.Intn(25))
  }
}

該程序首先在第三行中導入 math/rand 軟件包,然後移至將運行 10 次的循環中。在循環中,程序將打印一個在 025 範圍內的隨機整數。其中, 整數 25 是作爲其參數傳遞給 rand.Intn()

當我們使用 go run random.go 來運行程序時,我們將收到 10 個隨機整數作爲輸出。因爲這些是隨機的,所以每次運行程序時,你都可能會獲得不同的整數。輸出看起來像這樣:

# Output
6
12
22
9
6
18
0
15
6
0

整數永遠不會低於 0 或 24 以上。

當需要導入多個包時,你可以使用 () 來創建一個塊。通過使用塊,可以避免在每行上重複 import 關鍵字。這將使你的代碼看起來更整潔

random.go

import (
  "fmt"
  "math/rand"
)

爲了利用新增的軟件包,我們現在可以格式化輸出並打印出循環中每次迭代生成的隨機數:

random.go

package main

import (
  "fmt"
  "math/rand"
)

func main() {
  for i := 0; i < 10; i++ {
    fmt.Printf("%d) %d\n", i, rand.Intn(25))
  }
}

現在,當我們運行程序時,我們將收到看起來像這樣的輸出:

# Output
0) 6
1) 12
2) 22
3) 9
4) 6
5) 18
6) 0
7) 15
8) 6
9) 0

在本節中,我們學會了如何導入軟件包並使用它們來編寫更復雜的程序。到目前爲止,我們只使用了標準庫中的軟件包。接下來,讓我們看看如何安裝和使用其他開發人員編寫的軟件包。

安裝軟件包

雖然標準庫包含了許多出色且有用的軟件包,但它們的設計是通用的,本質上不是特定的。這使開發者可以根據自己的特定需求在標準庫之上構建自己的軟件包。

GO 工具鏈帶有 go get 命令。此命令使你可以將第三方軟件包安裝到本地開發環境中,並且將這些軟件包應用到你的程序中。

使用 go get 來安裝第三方軟件包時,通常可以通過其規範路徑引用軟件包。這個路徑也可能是通往公共項目的途徑,該項目託管在諸如 GitHub 之類的代碼存儲庫中。因此,如果要導入 flect 軟件包,則將使用完整的規範路徑:

go get github.com/gobuffalo/flect

在這種情況下,使用 go get 工具將在 GitHub 上找到軟件包,並將其安裝到你的 $Gopath點擊跳轉往期文章哦~)中。

對於此示例,代碼將安裝在此目錄中:

$GOPATH/src/github.com/gobuffalo/flect

原始作者通常會更新軟件包,以解決  bug 或添加新功能。發生這種情況時,你可能需要使用該軟件包的最新版本來利用新功能或已解決的 bug。要更新軟件包,你可以使用 go get 命令使用 -u 標誌:

go get -u github.com/gobuffalo/flect

如果在本地找不到該軟件包,此命令也將安裝該軟件包。如果已經安裝了它,Go 將嘗試將軟件包更新爲最新版本。

go get 命令始終檢索可用的包裝的最新版本。但是,可能還會對該軟件包的之前的版本進行更新,這些版本仍然比你使用的更新,並且對你的程序中的更新非常有用。要檢索包裝的特定版本,你需要使用一個軟件包管理工具,例如 Go Modules

從 GO 1.11 開始,使用 Go Modules 來管理要導入的軟件包的哪個版本。軟件包管理的主題超出了本文的範圍,但是你可以在 on the Go Modules GitHub page 上閱讀有關它的更多信息。

使用別名的方式導入軟件包

如果你的本地軟件包已經命名爲與你正在使用的第三方軟件包相同的包名時,則可能需要更改軟件包名稱。當發生這種情況時,使別名導入的方式是處理軟件包名衝突的最佳方法。你可以通過將 alias 名稱放在導入的軟件包的前面來修改包裝及其功能的名稱及其功能。

該聲明的結構看起來像這樣:

import another_name "package"

在此示例中,在 random.go 程序文件中修改 fmt 軟件包的名稱。我們將 fmt 的包名稱更改爲 f,以縮寫它。我們的修改程序看起來像這樣:

random.go

package main

import (
 f "fmt"
  "math/rand"
)

func main() {
  for i := 0; i < 10; i++ {
    f.Printf("%d) %d\n", i, rand.Intn(25))
  }
}

在程序中,我們現在將 Printf 函數稱爲 f.Printf,而不是 fmt.Printf

雖然其他語言喜歡以別名的方式命名包以便於在程序中更加容易使用,但 GO 卻不是。例如,與 fmt 軟件包與 f 相反, style guide 更加傾向於一致。

在重命名導入包以避免命名衝突時,你應該重命名本地導入的軟件包或特定的項目中導入的包。例如,如果你有一個名爲 Strings 的本地軟件包,並且還需要導入稱爲 strings 的系統軟件包,你應該重命名本地軟件包而不是系統軟件包。只要有可能,最好避免完全命名衝突。

在本節中,我們瞭解瞭如何以別名的方式導入軟件包以避免與我們計劃中的其他導入衝突。重要的是要記住,程序的可讀性和清晰度很重要,因此你只能使用別名使代碼更可讀或何時需要避免命名衝突。

格式化導入

通過格式化導入,你可以將軟件包分爲特定的順序,以使你的代碼更加一致。此外,當惟一改變的是導入的排序順序時,這將防止發生隨機提交。由於格式化導入將防止隨機提交,因此這將防止不必要的代碼混亂和混淆代碼審查。

大多數編輯器將自動爲你格式化導入,或者讓你配置編輯器以使用 goimports 工具。在編輯器中使用 goimports 被認爲是標準實踐,因爲嘗試手動維護導入的排序順序可能是乏味的,而且容易出錯。此外,如果進行了任何樣式更改,則將更新 goimports 以反映這些樣式更改。這樣可以確保你和任何在代碼上工作的人都將在你的 import 塊中具有一致的樣式。

這是格式化之前的示例導入塊可能的樣子:

import (
  "fmt"
  "os"
  "github.com/digital/ocean/godo"
  "github.com/sammy/foo"
  "math/rand"
  "github.com/sammy/bar"
)

運行 goimport 工具 (或使用已安裝它的大多數編輯器,保存文件將爲你運行),現在你將具有以下格式:

import (
  "fmt"
  "math/rand"
  "os"

  "github.com/sammy/foo"
  "github.com/sammy/bar"

  "github.com/digital/ocean/godo"
)

請注意,它首先將所有標準庫軟件包分組,然後將第三方軟件包與空白行分組。這使得更容易閱讀和了解正在使用哪些軟件包。

在本節中,我們瞭解到,使用 goimports 將保持我們所有導入塊的正確格式,並防止在處理相同文件在開發人員之間產生不必要的代碼混亂。

總結

當我們導入軟件包時,我們可以調用未內置的功能。有些軟件包是隨着 GO 安裝的標準庫的一部分,有些軟件包將通過 go get 來安裝。

使用軟件包可以使我們在利用現有代碼時使程序更加健壯和強大。我們還可以爲自己和其他程序員《創建自己的軟件包(點擊跳轉往期文章哦~),以便將來使用。

相關鏈接:

flecthttps://github.com/gobuffalo/flect

Go Moduleshttps://github.com/golang/go/wiki/Modules

on the Go Modules GitHub page:https://github.com/golang/go/wiki/Modules

style guide:https://github.com/golang/go/wiki/CodeReviewComments#import-dot

goimports:https://godoc.org/golang.org/x/tools/cmd/goimports

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/bLGMuPUlpc7byF1yx-nYBA