Golang學(xué)習(xí)筆記-1.10 包的理解

本文系第十篇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 buildgo 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ù)名AreaDiagonal番舆,首字母大寫酝碳。這是因為在Go中,任何以大寫字母開頭的變量或函數(shù)恨狈,都是被導(dǎo)出的名字疏哗。其他包只能訪問到被導(dǎo)出的函數(shù)或變量。main包要訪問函數(shù)AreaDiagonal拴事,因此首字母必須大寫沃斤。

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 包的理解篇

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涝影,一起剝皮案震驚了整個濱河市枣察,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燃逻,老刑警劉巖序目,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伯襟,居然都是意外死亡猿涨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門姆怪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叛赚,“玉大人澡绩,你說我怎么就攤上這事“掣剑” “怎么了肥卡?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長事镣。 經(jīng)常有香客問我步鉴,道長,這世上最難降的妖魔是什么璃哟? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任唠叛,我火速辦了婚禮,結(jié)果婚禮上沮稚,老公的妹妹穿的比我還像新娘。我一直安慰自己册舞,他們只是感情好蕴掏,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著调鲸,像睡著了一般盛杰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上藐石,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天即供,我揣著相機與錄音,去河邊找鬼于微。 笑死逗嫡,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的株依。 我是一名探鬼主播驱证,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼恋腕!你這毒婦竟也來了抹锄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤荠藤,失蹤者是張志新(化名)和其女友劉穎伙单,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哈肖,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡吻育,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了牡彻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扫沼。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡出爹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出缎除,到底是詐尸還是另有隱情严就,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布器罐,位于F島的核電站梢为,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏轰坊。R本人自食惡果不足惜铸董,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肴沫。 院中可真熱鬧粟害,春花似錦、人聲如沸颤芬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽站蝠。三九已至汰具,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間菱魔,已是汗流浹背留荔。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留澜倦,地道東北人聚蝶。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像藻治,于是被迫代替她去往敵國和親既荚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容