GO語言的包


包介紹

包(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,但是只能被初始化一次。
  • 執行順序
  1. 先執行init()函數,后執行main()函數
  2. 對於同一個go文件中,調用順序是從上向下的,也就是先寫的先被執行,后寫的后被執行
  3. 對於同一個包下,將文件名稱按照字符串進行排序,之后順序調用哥哥文件中的init()函數
  4. 不同包下,如果不存在依賴,按照main包中的import順序來調用對應包中的init()函數;如果存在依賴,最后被依賴 的最先被初始化,導入順序:main-->A-->B-->C,執行順序,C-->B-->A--main

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM