Go起步走 - 檔案基本結構


我們以官方Hello World程式來看一下Go的基本檔案結構:

package main

import "fmt"

func main() {
  fmt.Println("Hello World!")
}

整個檔案可以簡單切成3個部分。

1. package代表內容名稱

package代表這個檔案的內容摘要,同時也是這個檔案的標題,必須在第一行。

例如官方例子中的package main代表這個檔案內容標題為main,這是Go內建的規則,亦即在執行.go的程式時,一定要執行名稱為main的package,如果沒有,會出現錯誤訊息:

go run: cannot run non-main package

除此之外,每一個專案、套件都會有自己的package名稱,而這個名稱也是我們在後面import時會使用到的名稱。可以自定義:

package my_package

這樣在其他檔案內要import讀取此檔案時,就需要使用my_package這個名稱。

2. import代表載入的相依套件

官方例子中所載入的fmt套件名稱為format的縮寫,主要用於調整及顯示內容之用。

import同時也是管理專案用的工具,假如我們將一個專案切成不同檔案,一定有一個main檔案來import其他檔案,變成以下格式:

package main

import (
  "fmt"
  "./functions"
  "./api"
)

除了fmt以外,其他就是我們自訂的package名稱,通常這樣寫就代表我們有functionsapi兩個資料夾,./代表相對於該main檔案的同一個資料夾路徑。如果不想寫./這樣這麼醜的符號,Go預設搜尋package是從src目錄底下開始搜尋,所以可以寫成:

import "github.com/my_account/my_package"

這邊要注意,Go在載入專案時必須遵循這種package來源網址/開發者/package名稱的命名方式,一方面自己才能認得出來,一方面也是整個Go開發社群的慣例。

另外,import自定義package時要注意:

  1. 由於import只能指定資料夾,無法指定檔案
  2. 同一個資料夾底下只能有一個package,例如資料夾底下所有檔案的package名稱都統一是my_package

3. func main()代表主要執行的程式

如果檔案內的package名稱是main,則function名稱也一定要有一個是main,作為執行的起始。

如果沒有main function就行,會出現錯誤訊息:

# command-line-arguments
runtime.main_main: main.main: not defined
runtime.main_main: undefined: main.main

當然,除了main之外,我們也可定義其他funcion,但這些function就不會自動執行,而是需要在main function內呼叫。如下:

func hello() {
  fmt.Println("Hello World!")
}

func main() {
  hello()
}

以上是三個最基本的檔案結構介紹。