套件
前面介紹很多 go 語言程式設計的相關內容,但是如果把所有程式碼塞在一個 .go
的檔案之中這一篇文章要跟大家介紹如何將 go 語言的代碼分散到各個程式碼中。
使用套件來分配程式碼
在認識那麼多 go 的語法後,如何讓專案快速開發是所有的程式設計師所嚮往的技能,所以這邊跟大家介紹 package
這個語法,相信在第一個 Hello World 就有看到這個關鍵字,接下來要跟大家介紹這關鍵字,以及如何使用這關鍵字來管理專案的程式碼。
套件的撰寫
說到套件 package
這關鍵字,這裡再來複習一下Go Tour的第一個Hello Wolrd的程式碼,請大家看一下下列程式碼
package main
import "fmt"
func main() {
fmt.Println("Hello, 世界")
}
這最上面就是宣告說目前的套件是 main
這個套件,其實這 package
就類似 c
、 c++
、 c#
的 namespace
,在命名空間可以看到這是用來宣告目前程式的可視範圍,也就是讓程式知道這段程式在哪個地方可以被執行。接下來 import
就是把其他 package
導進來使用,例如這邊導入了 fmt
這個套件,並引用 fmt
的 Println
方法。
程式進入點
前面一個段落告訴大家 package
的功用,這邊在跟大家說明 main
這個套件是必要的,因為這是所有 go 程式的程式進入點,在 main
這個 package
的 main
方法是程式進入點,所有程式都由這方法開始執行。介紹完主要的 package
之後,接下來跟大家說明如何將程式分別寫在其他的 .go
檔。
程式的分割管理
上面介紹程式的進入點,如果說所有的程式都寫在程式進入點,這樣子管理起來應該會很困擾,所以我們把程式寫在其他的 .go
檔,然後在 main
裡面呼叫我們所寫的程式。這裡要先跟大家說明一下 package
的命名規則是小寫英文字,所以這邊我們寫一個 pkg 的 package
如下面例子
package pkg
var Hello = "Hello"
func SayHello() string {
return "Hello2"
}
上面我們撰寫一個pkg的套件,其中我們宣告一個全域變數 Hello 以及一個方法 SayHello,接下來我們存檔在 hello.go
這檔案,我們的目錄結構如下
main/
├── pkg/
│ ├──hello.go
├── hello.go
最後我們main.go的內容如下
package main
import (
"fmt"
"main/pkg"
)
func main(){
fmt.Println("Hello, world")
fmt.Println(pkg.Hello)
fmt.Println(pkg.SayHello())
}
上面例子說明在程式進入點中,如何透過 import
把我們撰寫在 pkg\hello.go 的程式碼給引用進來並且使用,這裡注意 Hello 的全域變數,讀者們可以試著把他改成 hello,並編譯看看,應該會發現編譯不過,因為命名的不同所代表的存取權限就不同,其中 Hello 字首大寫 為 public
,相對的字首小寫 hello 則為 private
,所以在撰寫 go 的語法要注意命名。
資料夾的規劃
在說明完如何將 go 的程式做一個切分後,接下來要說明一個好的專案結構的開始是一個專案成功的一半,所以專案結構就是說明專案內的程式要怎麼擺放,這邊可以看看 project-layout 建議的專案目錄結構,相信有一個大家認同的專案結構開發起來會事半功倍。
套件的初始化
當然有時候程序會做一些初始化設定,當然這程序必須是在載入該套件時就要被執行的程式碼,接下來的例子是告訴大家如何做到,請大家先看一下下列例子
package pkg
var Hello = "Hello"
func init() {
fmt.Println("This is pkg init")
}
func SayHello() string {
return "Hello2"
}
如此在上面的套件被引用時他的init
就會被執行,除此之外main
也可以有初始化函式,他的寫法跟套件一樣,大家可以看一下下列例子
package main
import (
"fmt"
"main/pkg"
)
func init() {
fmt.Println("This is main init")
}
func main(){
fmt.Println("Hello, world")
fmt.Println(pkg.Hello)
fmt.Println(pkg.SayHello())
}
每個套件的init
被執行的順序是依照import
的順序,等到最後被import
套件的init
被執行後才會執行mian
的init
。
結論
這篇文章介紹如何將 go 的程式碼做切分,並且說明存取權限是如何設置的,最後跟大家介紹一個許多人認可專案結構,希望對大家的 go 專案開法有所幫助。