
golang
原文發(fā)布在我的個人博客 入坑Go語言(二) | 以太空間
一、概述
??想學(xué)習(xí)Golang,包肯定是繞不過去的,就像C語言的標(biāo)準(zhǔn)庫,這篇文章里,我將為大家介紹關(guān)于Go語言包機(jī)制的使用、注意事項和原理
二、package
package遵循以下原則:
-
package是最基本的分發(fā)單位和工程管理中依賴關(guān)系的體現(xiàn) - 每個Go語言源代碼文件開頭都必須要有一個
package聲明,表示源代碼文件所屬包 - 要生成Go語言可執(zhí)行程序,必須要有名為
main的package包,且在該包下必須有且只有一個main函數(shù) -
同一個路徑下只能存在一個
package,一個package可以由多個源代碼文件組成
??按照我個人的理解,一個目錄就是一個包,該目錄下的所有文件必須屬于同一個包。
??再來看看多文件的Package
// File: main.go
package main
import "fmt"
func learn() {
fmt.Println("I am learning.")
}
func main() {
fmt.Println("----main start ----")
learn()
eat()
fmt.Println("----main end ----")
}
// File: eat.go
package main
import "fmt"
func eat() {
fmt.Println("I am eating.")
}
??在命令行編譯一下,然后執(zhí)行
$ go build . # 會在當(dāng)前目錄生成名為`go`的執(zhí)行文件
$ ./go
結(jié)果輸出
----main start ----
I am learning.
I am eating.
----main end ----
三、import
1. 作用與寫法
??import語句的唯一作用就是導(dǎo)入源碼文件所依賴的包,而且導(dǎo)入的包必須在源碼文件里用到,否則會報錯(在VS Code里如果輸入一個沒有導(dǎo)入的包函數(shù),VS Code會自動導(dǎo)入)
??import的寫法有兩種格式,我個人更傾向于第二種
import "package1"
import "package2"
import "package3"
improt (
"package1",
"package2",
"package3"
)
2. 原理
??跟package類似,import原理遵守以下幾個原則:
- 如果一個
main導(dǎo)入其他的包,包會被順序?qū)?/li> - 如果導(dǎo)入的包(
pkg1)依賴其他的包(包pkg2),會首先導(dǎo)入pkg2,然后初始化pkg2中的常量與變量,如果pkg2中有init函數(shù),會自動執(zhí)行init - 所有包導(dǎo)入完成后才會對
main的常量和變量進(jìn)行初始化,然后執(zhí)行main中的init函數(shù)(如果有的話),最后執(zhí)行main函數(shù) - 如果一個包被導(dǎo)入多次實際上只會導(dǎo)入一次
關(guān)于上面第三條規(guī)的import多重依賴的流程如下圖所示

go_import
3. import別名
import iii "fmt"
// 此處省略一些代碼...
iii.Println("hello")
??如果別名是.的話,則可以這樣調(diào)用(一般不建議這樣使用)
import . "fmt"
// 此處省略一些代碼...
Println("hello")
??有一個最特別的情況,如果別名是
_的話,表示只注冊該包(初始化全局常量和變量,且執(zhí)行其init函數(shù)),并不會實際引入該包。