您好,登錄后才能下訂單哦!
這篇“Go語言如何導入包”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Go語言如何導入包”文章吧。
在Go語言中,可以通過import語句來導入包,導入的包名使用雙引號包圍,包名是從GOPATH開始計算的路徑,使用“/”進行路徑分隔。使用import導入包有兩種基本格式:1、單行導入語法“import "包1" import "包2"”;2、多行導入語法“import("包1" "包2" …)”。
Go語言import導入包——在代碼中使用其他的代碼
可以在一個 Go語言源文件包聲明語句之后,其它非導入聲明語句之前,包含零到多個導入包聲明語句。每個導入聲明可以單獨指定一個導入路徑,也可以通過圓括號同時導入多個導入路徑。要引用其他包的標識符,可以使用 import 關鍵字,導入的包名使用雙引號包圍,包名是從 GOPATH 開始計算的路徑,使用/進行路徑分隔。
默認導入的寫法
導入有兩種基本格式,即單行導入和多行導入,兩種導入方法的導入代碼效果是一致的。
1) 單行導入
單行導入格式如下:
import "包1"
import "包2"
2) 多行導入
當多行導入時,包名在 import 中的順序不影響導入效果,格式如下:
import(
"包1"
"包2"
…
)
導入包后自定義引用的包名
如果我們想同時導入兩個有著名字相同的包,例如 math/rand 包和 crypto/rand 包,那么導入聲明必須至少為一個同名包指定一個新的包名以避免沖突。這叫做導入包的重命名。
import (
"crypto/rand"
mrand "math/rand" // 將名稱替換為mrand避免沖突
)
導入包的重命名只影響當前的源文件。其它的源文件如果導入了相同的包,可以用導入包原本默認的名字或重命名為另一個完全不同的名字。
導入包重命名是一個有用的特性,它不僅僅只是為了解決名字沖突。如果導入的一個包名很笨重,特別是在一些自動生成的代碼中,這時候用一個簡短名稱會更方便。選擇用簡短名稱重命名導入包時候最好統一,以避免包名混亂。選擇另一個包名稱還可以幫助避免和本地普通變量名產生沖突。例如,如果文件中已經有了一個名為 path 的變量,那么我們可以將"path"標準包重命名為 pathpkg。
每個導入聲明語句都明確指定了當前包和被導入包之間的依賴關系。如果遇到包循環導入的情況,Go語言的構建工具將報告錯誤。
匿名導入包——只導入包但不使用包內類型和數值
如果只希望導入包,而不使用任何包內的結構和類型,也不調用包內的任何函數時,可以使用匿名導入包,格式如下:
import (
_ "path/to/package"
)
其中,path/to/package 表示要導入的包名,下畫線_表示匿名導入包。
匿名導入的包與其他方式導入包一樣會讓導入包編譯到可執行文件中,同時,導入包也會觸發 init() 函數調用。
包在程序啟動前的初始化入口:init
在某些需求的設計上需要在程序啟動時統一調用程序引用到的所有包的初始化函數,如果需要通過開發者手動調用這些初始化函數,那么這個過程可能會發生錯誤或者遺漏。我們希望在被引用的包內部,由包的編寫者獲得代碼啟動的通知,在程序啟動時做一些自己包內代碼的初始化工作。
例如,為了提高數學庫計算三角函數的執行效率,可以在程序啟動時,將三角函數的值提前在內存中建成索引表,外部程序通過查表的方式迅速獲得三角函數的值。但是三角函數索引表的初始化函數的調用不希望由每一個外部使用三角函數的開發者調用,如果在三角函數的包內有一個機制可以告訴三角函數包程序何時啟動,那么就可以解決初始化的問題。
Go 語言為以上問題提供了一個非常方便的特性:init() 函數。
init() 函數的特性如下:
每個源碼可以使用 1 個 init() 函數。
init() 函數會在程序執行前(main() 函數執行前)被自動調用。
調用順序為 main() 中引用的包,以深度優先順序初始化。
例如,假設有這樣的包引用關系:main→A→B→C,那么這些包的 init() 函數調用順序為:
C.init→B.init→A.init→main
說明:
同一個包中的多個 init() 函數的調用順序不可預期。
init() 函數不能被其他函數調用。
理解包導入后的init()函數初始化順序
Go 語言包會從 main 包開始檢查其引用的所有包,每個包也可能包含其他的包。Go 編譯器由此構建出一個樹狀的包引用關系,再根據引用順序決定編譯順序,依次編譯這些包的代碼。
在運行時,被最后導入的包會最先初始化并調用 init() 函數。
通過下面的代碼理解包的初始化順序。
代碼8-3 包導入初始化順序入口(…/chapter08/pkginit/main.go)
package main
import "chapter08/code8-2/pkg1"
func main() {
pkg1.ExecPkg1()
}
代碼說明如下:
第 3 行,導入 pkg1 包。
第 7 行,調用 pkg1 包的 ExecPkg1() 函數。
代碼8-4 包導入初始化順序pkg1(…/chapter08/pkginit/pkg1/pkg1.go)
package pkg1
import (
"chapter08/code8-2/pkg2"
"fmt"
)
func ExecPkg1() {
fmt.Println("ExecPkg1")
pkg2.ExecPkg2()
}
func init() {
fmt.Println("pkg1 init")
}
代碼說明如下:
第 4 行,導入 pkg2 包。
第 8 行,聲明 ExecPkg1() 函數。
第 12 行,調用 pkg2 包的 ExecPkg2() 函數。
第 15 行,在 pkg1 包初始化時,打印 pkg1 init。
代碼8-5 包導入初始化順序pkg2(…/chapter08/pkginit/pkg2/pkg2.go)
package pkg2
import "fmt"
func ExecPkg2() {
fmt.Println("ExecPkg2")
}
func init() {
fmt.Println("pkg2 init")
}
代碼說明如下:
第 5 行,聲明 ExecPkg2() 函數。
第 10 行,在 pkg2 包初始化時,打印 pkg2 init。
執行代碼,輸出如下:
pkg2 init
pkg1 init
ExecPkg1
ExecPkg2
以上就是關于“Go語言如何導入包”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。