網頁

2021/5/14

Golang 什麼是package

Go的package(包)的作用如下。

Go的package與Java的package作用類似,皆是用來組織原始碼檔(source files)的目錄。原始碼檔即副檔名為.go的檔案,簡稱go檔;換句話說一個package中會有零到多個go檔。

專案的功能越多代表原始碼檔越多,為了維護方便會把具有相同性質或行為的原始碼檔集中在一起,也就是放入同一個package中,如同把桌面上散亂的檔案分門別類地放入適合的資料夾一般。此外package可避免程式的命名衝突,不同package的原始碼檔中可使用相同的函式名稱,package即為一個命名空間(namespace)


在go原始碼檔中使用保留字package宣告package的的方式如下。

package packagename

"packagename"為package的名稱,例如命名為"paint"則寫法為:

package paint

package的命名應簡短、明確及有意義,以全小寫並盡量以單字(single word)命名,避免使用底線(_),減號(-),駝峰命名(e.g myPackage)分隔,不可有空白。


Go慣例上置放原始碼檔的package目錄和宣告的package名稱應相同(也可以不同,但盡量避免)。

例如專案中有處理顏色的程式叫color.go、處理形狀的的程式叫shape.go、處理位置的程式叫location.go、處理地區的程式叫zone.go,則或許可以使用package paint來放置顏色和形狀的程式;使用package geography來放置位置和地區的程式如下。

src/
├── geography/
│   ├── location.go
│   └── zone.go
└── paint/
    ├── color.go
    └── shape.go

以上各程式的package宣告如下。

color.go

package paint

// other declarations

shape.go

package paint

// other declarations

location.go

package geography

// other declarations

zone.go

package geography

// other declarations

原始檔的目錄與package應相同,所以color.goshape.go宣告package paint
location.gozone.go宣告package geography


同個package中的原始碼檔可存取彼此的特性(例如常數、變數、函式等):而一個原始碼檔的特性必須定義為可匯出名稱(exported name)才能被不同package的原始碼檔存取。這類似於物件導向程式(OOP)的封裝(encapsulation)概念,即隱藏外界不需知道的特性,只有匯出的特性才能被外部看見及使用。


此外Go要求命令可執行的應用程式(主程式)的package必須為main,而main package中的go檔的func main()函式則為執行時的進入點(entry point)。例如在「我的第一支Go程式 hello world」範例的hello.go為可執行程式,其package即為main


沒有留言:

張貼留言