您好,登錄后才能下訂單哦!
在工程化的Go語言開發項目中,Go語言的源碼復用是建立在包(package)基礎之上的,本文介紹了go語言中如何定義包,如何導出包的內容以及如何導入其他包。
包(package)是多個Go源碼的集合,是一種高級的代碼復用方案,go語言為我們提供了很多的內置包,如fmt、os、io等。
我們還可以根據自己的需要創建自己的包,一個包可以簡單理解為一個存放.go文件的文件夾。該文件夾下面的所有go文件都要在代碼的第一行添加如下代碼,聲明該文件歸屬包。
package 包名
注意事項:
1、一個文件夾下只能有一個包,同樣一個包的文件不能在多個文件夾下。
2、包名可以不和文件夾的名字一樣,包名不能包含-符號
3、包名為main的包為應用程序的入口包,編譯時不包含main包的源代碼時不會得到可執行文件。
如果想在一個包中引用另外一個包里的標識符(如變量、常量、類型、函數等),該標識符必須是對外可見的(public)。在go語言中只需要將標識符的首字母大寫就可以讓標識符對外可見。
舉個例子,我們定義一個包名為pkg2的包,代碼如下:
var a = 100
const Mode = 1
type person struct {
name string
}
func Add(x, y int) int {
return x + y
}
func age() {
var Age = 18
fmt.Println(Age)
}
結構體中的字段名和接口中的方法名如果首字母都是大寫,外部包可以訪問這個字段和方法,例如:
type Student struct {
Name string
class string
}
type Payer interface{
init()
Pay()
}
要在代碼中引用其他包的內容,需要使用import 關鍵字導入使用的包。具體語法如下:
import "包的路徑"
注意事項:
在導入包名的時候,我們還可以為導入的包名設置別名。具體格式如下:
import 別名 "包的路徑"
多行導入方式定義別名:
import (
"fmt"
m "github.com/Q1mi/studygo/pkg_test"
)
func main(){
fmt.Println(m.Add(100,200))
fmt.Println(m.Mode)
}
如果只希望導入包,而不使用包內部的數據時,可以使用匿名導入包。具體的格式如下:
import _ "包的路徑"
匿名導入的包與其他方式導入的包一樣都會被編譯到可執行文件中。
在Go語言程序執行時導入包語句會自動觸發包內部init()函數的調用,需要注意的是:init()函數沒有參數也沒有返回值。init()函數在程序運行時自動被調用執行,不能在代碼中主動調用它。
包初始化執行的順序如下圖所示:
Go語言包會從main包開始檢查其導入的所有包,每個包中又可能導入了其他包,Go編譯器由此構建出一個樹狀的包引用關系,再根據引用順序決定編譯順序,依次編譯這些包的代碼。
在運行時,被最后導入的包會最先初始化并調用其init()函數,如下圖示:
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。