在工程化的GO語言開發項目中,GO語言的源碼複用是創建在包(pakage)基礎之上的。
不只GO語言中有包的概念,別的語言中也是有包的概念的。
1.Go語言的包(package)
1.1包介紹
包(package)是多個Go源碼的集合,是一種高級的代碼複用方案,Go語言爲咱們提供了不少內置包,如fmt,os,io等。
1.2定義包
咱們能夠根據本身的須要建立本身的包。
一個包能夠簡單理解爲一個存放.go文件的文件夾。該文件夾下面的全部go文件都要在代碼的第一行添加以下代碼,聲明改文件歸屬的包。
package 包名
注意事項:
1.一個文件夾下面直接包含的文件只能歸屬一個package,一樣一個package的文件不能再多個文件夾下。
2.包名能夠不和文件夾的名字同樣,包名不能包含-符號。
3.包名爲main的包爲應用程序的入口包,這種包編譯後會獲得一個可執行文件,而編譯不包含main包的源代碼則不會獲得可執行文件。
1.3可見性
若是想在一個包中引用另一個包裏的標識符(如變量,常量,類型,函數等)時,該標識符必須是對外可見的(public)。
在Go語言中,只須要將標識符的首字母大寫就可讓標識符對外可見了。
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)
}
結構體中的字段名和接口中的方法名若是首字母都是大寫,外部包能夠訪問這些字段和方法。例如:
type Student struct {
Name string //可在包外訪問的方法
class string //僅限包內訪問的字段
}
type Payer interface {
init() //僅限包內訪問的方法
Pay() //可在包外訪問的方法
}
1.4包的導入
要在代碼中引用其餘包的內容,須要使用import關鍵字導入使用的包。具體語法以下:
import "包的路徑"
注意事項:
1.import導入語句一般放在文件開頭包聲明語句的下面。
2.導入的包名須要使用雙引號包裹起來。
3.包名是從$GOPATH/src/後開始計算的,使用/進行路徑分隔。
4.GO語言中禁止循環導入包。
1.4.1單行導入
import "包1"
import "包2"
1.4.2多行導入
import (
"包1"
"包2"
)
1.5自定義包名
在導入包名的時候,咱們還能夠爲導入的包設置別名。一般用於導入的包名太長或者導入的包名衝突的狀況。具體語法格式以下:
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)
}
1.6匿名導入包
若是咱們只但願導入包,而不使用內部的數據時,可使用匿名導入包。具體格式以下:
import _ "包的路徑"
匿名導入的包與其餘方式導入的包同樣,都會被編譯到可執行文件中。
1.7init()初始化函數
1.7.1init()函數介紹
在Go語言程序執行時,導入包語句會自動觸發內部init()函數的調用。
須要注意的是:
init()函數沒有參數也沒有返回值。
init()函數在程序運行時自動被調用執行,不能再代碼中主動調用它。

1.7.2init()函數執行順序
Go語言包會從main包開始檢查其導入的全部包,每一個保重又可能導入了其餘的包。
Go編譯器由此構建出一個樹狀的包引用關係,再根據引用順序決定編譯順序,依次編譯這些包的代碼。

1.8練習
編寫一個clac包實現加減乘除四個功能函數,在snow這個包中導入並使用加減乘除四個函數實現數學運算。

