go語言碎片整理之包

在工程化的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導入語句通常放在文件開頭包聲明語句下面。
  • 導入的包名需要使用雙引號包裹起來。
  • 包名是從$GOPATH/src/後開始計算的,使用/進行路徑分割。
  • Go語言中禁止循環導入包。

自定義包名

在導入包名的時候,我們還可以爲導入的包名設置別名。具體格式如下:

import 別名  "包的路徑"

多行導入方式定義別名:

import (
    "fmt"
    m "github.com/Q1mi/studygo/pkg_test"
)
func main(){
    fmt.Println(m.Add(100,200))
    fmt.Println(m.Mode)
}

匿名導入包

如果只希望導入包,而不使用包內部的數據時,可以使用匿名導入包。具體的格式如下:

import _  "包的路徑"

匿名導入的包與其他方式導入的包一樣都會被編譯到可執行文件中。

init()初始化函數

init()函數介紹

在Go語言程序執行時導入包語句會自動觸發包內部init()函數的調用,需要注意的是:init()函數沒有參數也沒有返回值。init()函數在程序運行時自動被調用執行,不能在代碼中主動調用它。
包初始化執行的順序如下圖所示:

go語言碎片整理之包

init()函數執行順序

Go語言包會從main包開始檢查其導入的所有包,每個包中又可能導入了其他包,Go編譯器由此構建出一個樹狀的包引用關係,再根據引用順序決定編譯順序,依次編譯這些包的代碼。
在運行時,被最後導入的包會最先初始化並調用其init()函數,如下圖示:
go語言碎片整理之包

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章