本文系第十篇Golang語言學(xué)習(xí)教程
什么是包?為什么用包览徒?
Go語言的包和其他語言的庫或模塊類似狈定,目的是為了支持封裝、模塊化习蓬、單獨編譯和代碼重用纽什。
一個包的源代碼保存在一個或多個以.go
為文件后綴名的源文件中。
每個包對應(yīng)一個獨立的名字空間躲叼,例如芦缰,在image
包中和在unicode/utf16
包中的Decode
函數(shù)是不同的。要在外部引用該函數(shù)枫慷,需要image.Decode
形式訪問让蕾。
main函數(shù)和main包
所有可執(zhí)行的Go程序必須包含一個main函數(shù),這個函數(shù)是程序的入口或听,main函數(shù)必須放在main包中探孝。
在1.2,hello誉裆,world中有寫過編譯代碼go build
和go install
兩種方式顿颅,以及區(qū)別。
例1:
package main //每一個 Go 文件都應(yīng)該在開頭進(jìn)行 package name 的聲明(譯注:只有可執(zhí)行程序的包名應(yīng)當(dāng)為 main)足丢。表明該文件屬于哪個包粱腻。
import "fmt" //引入了 fmt 包,用于在 main 函數(shù)里面打印文本到標(biāo)準(zhǔn)輸出斩跌。
func main() {
fmt.Println("Hello,World!")
}
//func聲明函數(shù)main绍些,調(diào)用 fmt 包的 Println 函數(shù)做標(biāo)準(zhǔn)輸出。{}中的內(nèi)容稱之為函數(shù)體耀鸦。
創(chuàng)建自定義的包
我們將構(gòu)建一個計算矩形面積和對角線的應(yīng)用程序柬批,更好的理解包。(本例來源于Go中文網(wǎng))
我們將組織代碼,使得所有與矩形有關(guān)的功能都放入rectangle
包中氮帐。
創(chuàng)建一個自定義包rectangle
锻霎,它有一個計算矩形面積和對角線的函數(shù)。
創(chuàng)建一個geometry的文件夾揪漩,并在其中創(chuàng)建一個rectangle
文件夾,用于存放包的源文件吏口,在這個文件夾中奄容,所有文件都會以package rectangle
開頭,因為他們屬于rectangle包产徊。
創(chuàng)建名為rectprops.go
的文件昂勒,編寫代碼
例2:
//rectprops.go
package rectangle
import "math"
func Area(len, wid float64) float64 { //定義面積的函數(shù)
area := len * wid
return area
}
func Diagonal(len, wid float64) float64 { //定義對角線的函數(shù)
diagonal := math.Sqrt((len *len) + (wid * wid)) //Sqrt函數(shù)用來計算平方根
return diagonal
}
再上面程序中,創(chuàng)建了兩個函數(shù)用于計算Area和Diagonal舟铜。
矩形的面積= 長 * 寬
矩形的對角線= (長的平方 + 寬的平方)的平方根
math
包下面的Sqrt
函數(shù)用于計算平方根.
導(dǎo)入自定義包
為了使用自定義包戈盈,首先需要在可執(zhí)行文件中導(dǎo)入包,導(dǎo)入的語法為 import path
谆刨。我們必須指定自定義包相對于工作區(qū)內(nèi)src
文件夾的相對路徑塘娶。
在geometry文件夾中創(chuàng)建可執(zhí)行文件geometry.go用于導(dǎo)入自定義包。
例3
//geometry.go
package main
import (
"fmt"
"geometry/rectangle" //導(dǎo)入自定義包
)
func main() {
var rectLen, rectWidth float64 = 6, 7 //定義長痊夭、寬的變量
/* %.2f 會將浮點數(shù)精確到小數(shù)點后兩位*/
fmt.Printf("area of rectangle %.2f\n",rectangle.Area(rectLen, rectWidth)) //調(diào)用函數(shù)計算面積
fmt.Printf("diagonal of rectangle %.2f\n",rectangle.Diagonal(rectLen,rectWidth)) //調(diào)用函數(shù)計算對角線
}
上面的代碼導(dǎo)入了rectangle
包刁岸,并調(diào)用了里面的 Area 和 Diagonal 函數(shù),得到矩形的面積和對角線她我。Printf 內(nèi)的格式說明符 %.2f
會將浮點數(shù)截斷到小數(shù)點兩位虹曙。應(yīng)用程序的輸出為:
area of rectangle 42.00
diagonal of rectangle 9.22
導(dǎo)出名字
我們在創(chuàng)建函數(shù)的文件中,將兩個函數(shù)名Area
和Diagonal
番舆,首字母大寫酝碳。這是因為在Go中,任何以大寫字母開頭的變量或函數(shù)恨狈,都是被導(dǎo)出的名字疏哗。其他包只能訪問到被導(dǎo)出的函數(shù)或變量。main包要訪問函數(shù)Area
和Diagonal
拴事,因此首字母必須大寫沃斤。
init函數(shù)
任何包都可以包含一個init函數(shù),可用于執(zhí)行初始化任務(wù)刃宵,也可以用于驗證程序正確性衡瓶。init不應(yīng)有任何返回值類型和參數(shù),init函數(shù)行書如下:
func init() {
}
包的初始化順序如下:
- 首先初始化包級別(Package Level)的變量
- 緊接著調(diào)用 init 函數(shù)牲证。包可以有多個 init 函數(shù)(在一個文件或分布于多個文件中)哮针,它們按照編譯器解析它們的順序進(jìn)行調(diào)用。
如果一個包導(dǎo)入了另一個包,會先初始化被導(dǎo)入的包十厢。
盡管一個包可能會被導(dǎo)入多次等太,但是它只會被初始化一次。
為了理解 init 函數(shù)蛮放,我們接下來對程序做了一些修改缩抡。
首先在 rectprops.go
文件中添加了一個 init 函數(shù)。
例4
// rectprops.go
package rectangle
import "math"
import "fmt"
func init() {
fmt.Println("rectangle package initialized")
}
func Area(len, wid float64) float64 {
area := len * wid
return area
}
func Diagonal(len, wid float64) float64 {
diagonal := math.Sqrt((len * len) + (wid * wid))
return diagonal
}
我們添加了一個 init 函數(shù)包颁,它僅打印 rectangle package initialized
瞻想。
接下來修改main包,我們都知道矩形的長寬都應(yīng)該大于0娩嚼,我們將在 geometry.go
中使用 init 函數(shù)和包級別的變量來檢查矩形的長和寬蘑险。
例5
//geometry.go
package main
import (
"fmt"
"geometry/rectangle"
"log"
)
/*
*1.包級別變量
*/
var rectLen, rectWidth float64 = 6, 7 //定義長、寬的變量
/*
*2.init函數(shù)檢查長寬是否大于0
*/
func init() {
if rectLen <= 0 {
log.Fatal("length is less than zero")
}
if rectWidth <= 0 {
log.Fatal("width is less than zero")
}
}
func main() {
/* %.2f 會將浮點數(shù)精確到小數(shù)點后兩位*/
fmt.Printf("area of rectangle %.2f\n",rectangle.Area(rectLen, rectWidth)) //調(diào)用函數(shù)計算面積
fmt.Printf("diagonal of rectangle %.2f\n",rectangle.Diagonal(rectLen,rectWidth)) //調(diào)用函數(shù)計算對角線
}
我們對 geometry.go 做了如下修改:
- 變量 rectLen 和 rectWidth 從 main 函數(shù)級別移到了包級別岳悟。
- 添加了 init 函數(shù)佃迄。當(dāng) rectLen 或 rectWidth 小于 0 時,init 函數(shù)使用 log.Fatal 函數(shù)打印一條日志贵少,并終止了程序呵俏。
以上矩形長寬大于0 ,所以輸出正常春瞬,無報錯柴信,接著我們將長修改為負(fù)數(shù):
var rectLen, rectWidth float64 = -6, 7
運行程序?qū)箦e:length is less than zero
空白標(biāo)識符
我們在程序的開發(fā)活躍階段,常常要導(dǎo)入很多包宽气,卻暫不使用它随常,但是運行的時候go會報錯imported and not used...
,那么遇到這種情況可以使用空白標(biāo)識符_
萄涯。
例6
package main
import (
"geometry/rectangle"
)
var _ = rectangle.Area // 錯誤屏蔽器
func main() {
}
var _ = rectangle.Area 這一行屏蔽了錯誤绪氛。運行時不會再報錯。
以上為學(xué)習(xí)Golang 包的理解篇