目錄html
更新、更全的《Go從入門到放棄》的更新網站,更有python、go、人工智能教學等着你:http://www.javashuo.com/article/p-mxrjjcnn-hn.htmlpython
在工程化的Go語言開發項目中,Go語言的源碼複用是創建在包(package)基礎之上的。本文介紹了Go語言中如何定義包、如何導出包的內容及如何導入其餘包。git
包(package)
是多個Go源碼的集合,是一種高級的代碼複用方案,Go語言爲咱們提供了不少內置包,如fmt
、os
、io
等。github
咱們還能夠根據本身的須要建立本身的包。一個包能夠簡單理解爲一個存放.go
文件的文件夾。 該文件夾下面的全部go文件都要在代碼的第一行添加以下代碼,聲明該文件歸屬的包。函數
package 包名
注意事項:網站
-
符號。若是想在一個包中引用另一個包裏的標識符(如變量、常量、類型、函數等)時,該標識符必須是對外可見的(public)。在Go語言中只須要將標識符的首字母大寫就可讓標識符對外可見了。人工智能
舉個例子, 咱們定義一個包名爲pkg2
的包,代碼以下:3d
package pkg2 import "fmt" // 包變量可見性 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) }
結構體中的字段名和接口中的方法名若是首字母都是大寫,外部包能夠訪問這些字段和方法。例如:code
type Student struct { Name string //可在包外訪問的方法 class string //僅限包內訪問的字段 } type Payer interface { init() //僅限包內訪問的方法 Pay() //可在包外訪問的方法 }
要在代碼中引用其餘包的內容,須要使用import
關鍵字導入使用的包。具體語法以下:htm
import "包的路徑"
注意事項:
$GOPATH/src/
後開始計算的,使用/
進行路徑分隔。單行導入的格式以下:
import "包1" import "包2"
多行導入的格式以下:
import ( "包1" "包2" )
在導入包名的時候,咱們還能夠爲導入的包設置別名。具體語法格式以下:
import 別名 "包的路徑"
單行導入方式定義別名:
import "fmt" import m "github.com/Q1mi/studygo/pkg_test" func main() { fmt.Println(m.Add(100, 200)) fmt.Println(m.Mode) }
多行導入方式定義別名:
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()
函數, 以下圖示:
clac
包實現加減乘除四個功能函數,在snow
這個包中導入並使用加減乘除四個函數實現數學運算。