包介紹
包(package)是多個Go源碼的集合,go語言有很多內置包,比如fmt,os,io等。
定義包
main包是一個可執行的包,只應用程序的入口包,編譯完會生成一個可執行文件。
一個目錄下的同級文件歸屬一個包。
包名可以不和文件夾的名字一樣,包名不能包含-符號。
package 包名
可見性
如果想在一個包中引用另外一個包里的標識符(如變量、常量、類型、函數等)時,該標識符必須是對外可見的(public)。在Go語言中只需要將標識符的首字母大寫就可以。
// 首字母小寫,外部包不可見,只能在當前包內使用
var num = 10
//首字母大寫外部包可見,可在其他包中使用
const Name = "ares"
// 首字母小寫,外部包不可見,只能在當前包內使用
type person struct {
name string
}
type Student struct {
Name string //可在包外訪問的方法
class string //僅限包內訪問的字段
}
type Payer interface {
init() //僅限包內訪問的方法
Pay() //可在包外訪問的方法
}
// 首字母大寫,外部包可見,可在其他包中使用
func Add(x, y int) int {
return x + y
}
func age() { // 首字母小寫,外部包不可見,只能在當前包內使用
var Age = 18 // 函數局部變量,外部包不可見,只能在當前函數內使用
fmt.Println(Age)
}
包的導入
使用import關鍵字。
import導入語句通常放在文件開頭包聲明語句的下面。
導入的包名需要使用雙引號包裹起來。
包名是從$GOPATH/src/后開始計算的,使用/進行路徑分隔。
import (
"ares.com/studygolang/pkg/math_pkg"
"fmt"
)
自定義包名
在導入包名的時候,我們還可以為導入的包設置別名。
//可以使用a.xxx來進行調用
import (
a "ares.com/studygolang/day04/pkg/math_pkg"
"fmt"
)
匿名導入包
如果只希望導入包,而不使用包內部的數據時,可以使用匿名導入包(僅調用包中的init()函數)。
import _ "包的路徑"
init()初始化函數
在Go語言程序執行時導入包語句會自動觸發包內部init()函數的調用。需要注意的是: init()函數沒有參數也沒有返回值。
import "fmt"
var x = 100
func init() {
fmt.Println(x) //100
}
func main() {
fmt.Println("Hello!") //Hello!
}
包中init函數的執行時機
全局聲明===>init()====>main()
init()函數執行順序

init()函數與main()函數對比
- 都是go語言中的保留函數。init()用於初始化信息,main()用於座位程序入口。
- 兩個函數定義的時候,不能有參數和返回值,只能由go程序自動調用,不能被引用。
- init()函數可以定義在任意包中,可以有多個。main()函數只能在main包下,並且只能有一個。
- 存在依賴的包之間不能循環導入。
- 一個包可以被其他多個包import,但是只能被初始化一次。
- 執行順序
- 先執行init()函數,后執行main()函數
- 對於同一個go文件中,調用順序是從上向下的,也就是先寫的先被執行,后寫的后被執行
- 對於同一個包下,將文件名稱按照字符串進行排序,之后順序調用哥哥文件中的init()函數
- 不同包下,如果不存在依賴,按照main包中的import順序來調用對應包中的init()函數;如果存在依賴,最后被依賴 的最先被初始化,導入順序:main-->A-->B-->C,執行順序,C-->B-->A--main