Go語言基礎之包

更新、更全的《Go從入門到放棄》的更新網站,更有python、go、人工智能教學等着你:http://www.javashuo.com/article/p-mxrjjcnn-hn.htmlpython

在工程化的Go語言開發項目中,Go語言的源碼複用是創建在包(package)基礎之上的。本文介紹了Go語言中如何定義包、如何導出包的內容及如何導入其餘包。git

1、Go語言的包(package)

2、包介紹

包(package)是多個Go源碼的集合,是一種高級的代碼複用方案,Go語言爲咱們提供了不少內置包,如fmtosio等。github

3、定義包

咱們還能夠根據本身的須要建立本身的包。一個包能夠簡單理解爲一個存放.go文件的文件夾。 該文件夾下面的全部go文件都要在代碼的第一行添加以下代碼,聲明該文件歸屬的包。函數

package 包名

注意事項:網站

  • 一個文件夾下面只能有一個包,一樣一個包的文件不能在多個文件夾下。
  • 包名能夠不和文件夾的名字同樣,包名不能包含-符號。
  • 包名爲main的包爲應用程序的入口包,編譯時不包含main包的源代碼時不會獲得可執行文件。

4、可見性

若是想在一個包中引用另一個包裏的標識符(如變量、常量、類型、函數等)時,該標識符必須是對外可見的(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()  //可在包外訪問的方法
}

5、包的導入

要在代碼中引用其餘包的內容,須要使用import關鍵字導入使用的包。具體語法以下:htm

import "包的路徑"

注意事項:

  • import導入語句一般放在文件開頭包聲明語句的下面。
  • 導入的包名須要使用雙引號包裹起來。
  • 包名是從$GOPATH/src/後開始計算的,使用/進行路徑分隔。
  • Go語言中禁止循環導入包。

5.1 單行導入

單行導入的格式以下:

import "包1"
import "包2"

5.2 多行導入

多行導入的格式以下:

import (
    "包1"
    "包2"
)

6、自定義包名

在導入包名的時候,咱們還能夠爲導入的包設置別名。具體語法格式以下:

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)
}

7、匿名導入包

若是隻但願導入包,而不使用包內部的數據時,可使用匿名導入包。具體的格式以下:

import _ "包的路徑"

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

8、init()初始化函數

8.1 init()函數介紹

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

包初始化執行的順序以下圖所示: init01.png

8.2 init()函數執行順序

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

在運行時,被最後導入的包會最早初始化並調用其init()函數, 以下圖示: init02.png

9、練習題

  1. 編寫一個clac包實現加減乘除四個功能函數,在snow這個包中導入並使用加減乘除四個函數實現數學運算。
相關文章
相關標籤/搜索