在工程化的go語言開發專案中,go語言的原始碼復用是建立在包(package)基礎之上的。本文介紹了go語言中如何定義包,如何匯出包的內容及如何匯入其他包。
包(package)是多個go原始碼的集合,是一種高階的**復用方案,go語言為我們提供了很多內建包,如fmt、os、io等。
我們還可以根據自己的需要建立自己的包。乙個包可以簡單理解為乙個存放.go檔案的資料夾。 該資料夾下面的所有go檔案都要在**的第一行新增如下**,宣告該檔案歸屬的包。
package 包名
注意事項:
如果想在乙個包中引用另外乙個包裡的識別符號(如變數、常量、型別、函式等)時,該識別符號必須是對外可見的(public)。在go語言中只需要將識別符號的首字母大寫就可以讓識別符號對外可見了。
舉個例子, 我們定義乙個包名為pkg2的包,**如下:
package pkg2
import "fmt"
// 包變數可見性
var a = 100 // 首字母小寫,外部包不可見,只能在當前包內使用
// 首字母大寫外部包可見,可在其他包中使用
const mode = 1
type person struct
// 首字母大寫,外部包可見,可在其他包中使用
func add(x, y int) int
func age()
結構體中的欄位名和介面中的方法名如果首字母都是大寫,外部包可以訪問這些欄位和方法。例如:
type student struct
type payer inte***ce
要在**中引用其他包的內容,需要使用import關鍵字匯入使用的包。具體語法如下:
import "包的路徑"
注意事項:
• import匯入語句通常放在檔案開頭包宣告語句的下面。
• 匯入的包名需要使用雙引號包裹起來。
• 包名是從$gopath/src/後開始計算的,使用/進行路徑分隔。
• go語言中禁止迴圈匯入包。
單行匯入的格式如下:
import "包1"
import "包2"
多行匯入的格式如下:
import (
"包1"
"包2"
)
在匯入包名的時候,我們還可以為匯入的包設定別名。通常用於匯入的包名太長或者匯入的包名衝突的情況。具體語法格式如下:
import 別名 "包的路徑"
單行匯入方式定義別名:
多行匯入方式定義別名:
如果只希望匯入包,而不使用包內部的資料時,可以使用匿名匯入包。具體的格式如下:
import _ "包的路徑"
匿名匯入的包與其他方式匯入的包一樣都會被編譯到可執行檔案中。
在go語言程式執行時匯入包語句會自動觸發包內部init()函式的呼叫。需要注意的是: init()函式沒有引數也沒有返回值。 init()函式在程式執行時自動被呼叫執行,不能在**中主動呼叫它。
包初始化執行的順序如下圖所示:
go語言包會從main包開始檢查其匯入的所有包,每個包中又可能匯入了其他的包。go編譯器由此構建出乙個樹狀的包引用關係,再根據引用順序決定編譯順序,依次編譯這些包的**。
在執行時,被最後匯入的包會最先初始化並呼叫其init()函式,如下圖示:
golang之flag包詳解
在golang中有很多方法來處理命令列引數,簡單情況下可以不使用任何庫,直接使用os.args 但是golang標準庫提供了flag包來處理命令列引數 還有第三方提供的處理命令列引數的庫cobra cli。flag包繫結解析引數有三種定義方式 flag.例如 flag.int,flag.string...
golang學習之閉包
匿名函式不能夠獨立存在,但可以被賦值於某個變數,即儲存函式的位址到變數中 fplus func x,y int int,然後通過變數名對函式進行呼叫 fplus 3,4 當然,也可以直接對匿名函式進行呼叫 func x,y int int 3,4 func 表示引數列表的第一對括號必須緊挨著關鍵字f...
Golang 之sync包應用
保證共享資源的互斥訪問 mutex sync.mutex mutex.lock update共享變數 比如切片,結構體指標等 mutex.unlock 讀寫互斥鎖,可以對讀加鎖 mutex sync.rwmutex mutex.lock update 共享變數 mutex.unlock mutex....