入坑Go語言(二)—— 包機(jī)制的理解

golang

原文發(fā)布在我的個人博客 入坑Go語言(二) | 以太空間

一、概述

??想學(xué)習(xí)Golang,包肯定是繞不過去的,就像C語言的標(biāo)準(zhǔn)庫,這篇文章里,我將為大家介紹關(guān)于Go語言包機(jī)制的使用、注意事項和原理

二、package

package遵循以下原則:

  1. package是最基本的分發(fā)單位和工程管理中依賴關(guān)系的體現(xiàn)
  2. 每個Go語言源代碼文件開頭都必須要有一個package聲明,表示源代碼文件所屬包
  3. 要生成Go語言可執(zhí)行程序,必須要有名為mainpackage包,且在該包下必須有且只有一個main函數(shù)
  4. 同一個路徑下只能存在一個package,一個package可以由多個源代碼文件組成

??按照我個人的理解,一個目錄就是一個包,該目錄下的所有文件必須屬于同一個包。

??再來看看多文件的Package

// File: main.go
package main

import "fmt"

func learn() {
    fmt.Println("I am learning.")
}

func main() {
    fmt.Println("----main start ----")
    learn()
    eat()
    fmt.Println("----main end ----")
}
// File: eat.go
package main

import "fmt"

func eat() {
    fmt.Println("I am eating.")
}

??在命令行編譯一下,然后執(zhí)行

$ go build . # 會在當(dāng)前目錄生成名為`go`的執(zhí)行文件
$ ./go

結(jié)果輸出

----main start ----
I am learning.
I am eating.
----main end ----

三、import

1. 作用與寫法

??import語句的唯一作用就是導(dǎo)入源碼文件所依賴的包,而且導(dǎo)入的包必須在源碼文件里用到,否則會報錯(在VS Code里如果輸入一個沒有導(dǎo)入的包函數(shù),VS Code會自動導(dǎo)入)

??import的寫法有兩種格式,我個人更傾向于第二種

import "package1"
import "package2"
import "package3"

improt (
    "package1",
    "package2",
    "package3"
)

2. 原理

??跟package類似,import原理遵守以下幾個原則:

  1. 如果一個main導(dǎo)入其他的包,包會被順序?qū)?/li>
  2. 如果導(dǎo)入的包(pkg1)依賴其他的包(包pkg2),會首先導(dǎo)入pkg2,然后初始化pkg2中的常量與變量,如果pkg2中有init函數(shù),會自動執(zhí)行init
  3. 所有包導(dǎo)入完成后才會對main的常量和變量進(jìn)行初始化,然后執(zhí)行main中的init函數(shù)(如果有的話),最后執(zhí)行main函數(shù)
  4. 如果一個包被導(dǎo)入多次實際上只會導(dǎo)入一次

關(guān)于上面第三條規(guī)的import多重依賴的流程如下圖所示

go_import

3. import別名

import iii "fmt"
// 此處省略一些代碼...
iii.Println("hello")

??如果別名是.的話,則可以這樣調(diào)用(一般不建議這樣使用)

import . "fmt"
// 此處省略一些代碼...
Println("hello")

??有一個最特別的情況,如果別名是_的話,表示只注冊該包(初始化全局常量和變量,且執(zhí)行其init函數(shù)),并不會實際引入該包。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時...
    歐辰_OSR閱讀 30,284評論 8 265
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,695評論 19 139
  • 示例 包的概念、導(dǎo)入與可見性 包是結(jié)構(gòu)化代碼的一種方式:每個程序都由包(通常簡稱為 pkg)的概念組成,可以使用自...
    若與閱讀 1,511評論 0 7
  • Go入門 Go介紹 部落圖鑒之Go:爹好還這么努力? 環(huán)境配置 安裝 下載源碼編譯安裝 下載相應(yīng)平臺的安裝包安裝 ...
    齊天大圣李圣杰閱讀 4,772評論 0 26
  • 1、五一放假期是岳父的生日,大家聚在一起聊聊,吃吃喝喝。不知不覺又吃太多了。平時一碗湯一碗飯菜;這回大概兩碗飯,一...
    敘事里遇見的美好時光閱讀 203評論 0 0

友情鏈接更多精彩內(nèi)容