原因:將程式所有的程式碼放入一個原始碼檔案是不合理的,需要分檔管理相關程式碼,但是隨著程式檔案的增多,也必須有一種將檔案加以組織管理的方式/形式,於是Go引入了「包」的概念。套件是程式功能/屬性「分散式管理」 、「歸一使用」的一種邏輯意義上的組織形式。
本教學操作環境:windows7系統、GO 1.18版本、Dell G3電腦。
我們用go語言開發的程式檔案稱為原始碼檔案(原始碼檔案必須以.go結尾)。很明顯將程式所有的程式碼放入一個原始碼檔案是不合理的,需要分檔管理相關程式碼,但是隨著程式檔案的增多,也必須有一種將檔案加以組織管理的方式/形式,於是Go引入了”包“的概念。
套件是go語言提供的一種虛擬的概念,套件聲明一致的多個原始碼檔案在邏輯上被組織到一起、同屬於一個套件。
Go語言的套件借助了目錄樹的組織形式,一般套件的名稱就是其原始檔案所在目錄的名稱,雖然Go語言沒有強制要求套件名稱必須和其所在的目錄名稱同名,但還是建議包名和所在目錄同名,這樣結構更清晰。
套件可以定義在很深的目錄中,套件名稱的定義是不包含目錄路徑的,但是套件在引用時一般使用全路徑引用。例如在GOPATH/src/a/b/ 下定義一個包 c。在套件 c 的原始碼中只需宣告為package c,而不是宣告為package a/b/c,但在導入 c 套件時,需要帶上路徑,例如import "a/b/c"。
套件的習慣用法:
套件名稱一般是小寫的,使用一個簡短且有意義的名稱。
套件名稱一般要和所在的目錄同名,也可以不同,套件名稱中不能包含- 等特殊符號。
套件一般會使用網域名稱作為目錄名稱,這樣可以保證套件名稱的唯一性,例如GitHub 專案的套件一般會放到GOPATH/src/github.com/userName/projectName 目錄下。
套件名為 main 的套件為應用程式的入口包,編譯不包含 main 套件的源碼檔案時不會得到可執行檔。
一個資料夾下的所有原始碼檔案只能屬於同一個包,同樣屬於同一個包的源碼檔案不能放在多個資料夾下。
(1)套件的宣告、套件的導入路徑、注意的問題
//一:包的声明 // 1、每个源码文件都必须在文件头处声明自己归属的包。 package 包名 // 包名一般总是用小写字母 // 2、包名任意,包名一致的属于同一个包 // 3、包是编译和归档Go程序的最基本单位,一个包中的多个源码文件是一个不可分割的整体 //二:包的导入路径 强调强调强调!!!!!! 包是一个把多个源码文件归一到一起管理的虚拟单位,一定要记住,它只是一个虚拟的概念而已,而实实在在地讲,多个源码文件是要放置到一个实实在在的文件夹下的,这个实实在在的文件夹所处的路径是包的导入路径。包的导入路径很重要,他是包的"家庭住址",是用来找到包的(用在import语句中,稍后介绍),但它绝不等同于包的概念 //三:注意的问题 1、一个文件夹下只能放置一个包,也就是所一个文件夹下放置的多个源码文件的包声明必须一致,go以此来确保一个路径就唯一定位到唯一的一个包。 2、包虽然与文件夹路径是截然不同的意思,但是为了方便记忆,包通常应该声明为文件夹的名字 例如文件夹路径/a/b/c/mypkg,包名应声明为package mypkg,mypkg就为包名
(2)套件的區分與放置位置
套件是虛擬的、邏輯層面的概念,但套件組織的多個原始碼檔案確實是實實在在的,一定要放置在某一資料夾下.
請注意:為了後續書寫簡潔,筆者直接將包所組織的多個源碼文件的存放位置簡稱為包的存放位置,請讀者務必知曉。
main套件包含著程式的入口,主要用來運行,無論如何,main套件可以被放置於任意資料夾下。
筆者將main套件以外的套件稱為其他套件,具體是指內建套件、自訂套件、下載的第三方套件。有別於main包,其他包主要用來被導入使用,放置位置如下
// 内置包 内置包固定被放置在`$GOROOT/src/`下,与任何模式无关 // 自定义包 在未启用modules模式的情况下,自定义包需要放置在GOPATH指定的任意目录下的src中 // 下载的第三方包 在未启用modules模式的情况下,使用go工具链命令下载的第三方包总是默认被存放到GOPATH的第一个目录的src下 // 强调一下 在早期的Go环境中,自定义的包与下载的第三方包都是放到了$GOPATH/src下,因为早期Go采用的是和GOPATH模式,而且即便是在GO1.14.2版本中,在我们还未学习如何使用任何新模式前,默认使用的仍是GOPATH模式
ps:
1、內建包是筆者對標準包的一種愛稱
2、但凡存放在GOPATH工作區中的包,官方都稱之為工作區包
#(3)包的使用
// 1、一个源码文件中声明的函数、类型、变量和常量等标识符/名字对同一包中的所有其他源码文件都可见,不需要加任何前缀即可引用,因为代码包只是一种组织管理源码文件的形式,同一个包下的多个源码文件本就属于一个整体,事实上我们完全可以将一个包当成一个”大文件“去看,毫无疑问这个”大文件“中声明的标识符/名字不能重名 // 2、包名很关键 名为main的包可简称为”main包“,是程序的入口,go程序运行时会查找main包下的main函数,main函数既没有参数声明也没有结果声明,见下图 名不为main的包可称之为”其他包“,是程序的功能/属性集合,此类包用来被其他包导入使用,为何此时包名仍然很关键呢?因为我们导入时用的是导入路径(指的是包所在的路径,该路径不是绝对路径,稍后介绍),但是使用的则可能会使用"包名.xxx"
綜上:套件是程式功能/屬性「分散管理」 、「歸一使用」的一種邏輯意義上的組織形式
以上是go語言為什麼以套件組織代碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!