學習如何正確地組織 Go 程式碼:從單一檔案專案到套件、內部模組和適當的匯入,透過計算機範例進行解釋。學習如何正確地組織 Go 程式碼:從單一檔案專案到套件、內部模組和適當的匯入,透過計算機範例進行解釋。

如何像專業人士一樣組織您的 Go 專案

2025/10/06 11:36
閱讀時長 7 分鐘
如需對本內容提供反饋或相關疑問,請通過郵箱 crypto.news@mexc.com 聯絡我們。

\ 當我開始學習 Go 時,我首先想到的問題之一是:

"我該如何實際組織我的程式碼?"

在像 C 這樣的語言中,通常會將所有內容放入單個檔案中,或者可能分開標頭和實現檔案。但在 Go 中,專案結構非常重要:它影響著你擴展、測試和共享程式碼的難易程度。在本文中,我將介紹為什麼結構很重要,如何從不同檔案訪問函數,以及我在前進過程中學到的最佳實踐。


最簡單的 Go 程式

Go 程式可以完全存在於單個檔案中:

package main  import "fmt"  func main() {   fmt.Println("2 + 2 =", 2+2) } 

這對於"hello world"或快速實驗來說很好。

但一旦你添加更多功能(減法、乘法、除法...),檔案就會變得混亂且難以擴展。

這就是 Go 的套件資料夾發揮作用的地方。


介紹套件

在 Go 中,每個檔案都屬於一個套件

按照慣例:

  • main → 可執行程式
  • 其他(如 calculator、utils 等)→ 可重用邏輯

以下是我如何拆分計算器專案:

calculator/ │ ├── main.go └── calculator/     └── operations.go 

\

  • main.go → 處理輸入/輸出
  • operations.go → 定義函數如 Add、Subtract 等

範例:operations.go

package calculator  func Add(a, b int) int {   return a + b }  func Subtract(a, b int) int {   return a - b }  func Multiply(a, b int) int {   return a * b }  func Divide(a, b int) (int, error) {   if b == 0 {     return 0, fmt.Errorf("cannot divide by zero")   }   return a / b, nil } 

範例:main.go

package main  import (   "fmt"   "GoLang-progress/calculator" )  func main() {   fmt.Println("2 + 3 =", calculator.Add(2, 3))   fmt.Println("10 - 4 =", calculator.Subtract(10, 4))   fmt.Println("6 * 7 =", calculator.Multiply(6, 7))    result, err := calculator.Divide(8, 0)   if err != nil {     fmt.Println("Error:", err)   } else {     fmt.Println("8 / 0 =", result)   } } 

注意main.go 現在多麼乾淨:它不用擔心數學本身,只關注如何使用它。


從不同檔案訪問函數

一個常見的初學者問題:

"我如何從另一個檔案或資料夾調用函數?"

在我的儲存庫中,我這樣組織結構:

calculator/ │ ├── main.go └── internal/     └── calc/         └── operations.go 

這裡,數學函數位於 internal/calc 下。

operations.go(在 internal/calc 內)

\

package calc  import "fmt"  func Add(a, b int) int {   return a + b }  func Divide(a, b int) (int, error) {   if b == 0 {     return 0, fmt.Errorf("cannot divide by zero")   }   return a / b, nil } 

main.go(導入 internal/calc)

\

package main  import (   "fmt"   "github.com/turman17/GoLang-progress/calculator/internal/calc" )  func main() {   fmt.Println("2 + 3 =", calc.Add(2, 3))    result, err := calc.Divide(10, 0)   if err != nil {     fmt.Println("Error:", err)   } else {     fmt.Println("10 / 2 =", result)   } } 

為什麼需要這個導入路徑

你的導入必須匹配 go.mod 中的模組路徑加上資料夾路徑。

在你的儲存庫中,go.mod 包含:

module github.com/turman17/GoLang-progress 

你想使用的計算器程式碼位於資料夾:

calculator/internal/calc 

所以完整的導入路徑是:

github.com/turman17/GoLang-progress/calculator/internal/calc 

幾點重要注意事項

  • 資料夾名稱 ≠ 套件名稱 → 資料夾是 internal/calc,但裡面的套件宣告為 package calc。
  • 導入使用模組路徑 → 如果 go.mod 中有,總是以 github.com/... 開頭。
  • Internal 很特別 → /internal 下的套件只能被同一模組內的程式碼導入。

常見錯誤和修復

❌ import "GoLang-progress/calculator/internal/calc"

→ 缺少 GitHub 組織/用戶名。必須使用完整路徑。

❌ import "github.com/turman17/GoLang-progress/internal/calc"

→ 路徑中缺少 calculator 目錄。

❌ go: module not found errors

→ 確保 go.mod 有 module github.com/turman17/GoLang-progress 並運行 go mod tidy。


快速檢查清單

  • go.mod 有正確的模組行
  • 目錄是 calculator/internal/calc,內含 package calc
  • main.go 導入 github.com/turman17/GoLang-progress/calculator/internal/calc
  • 從模組根目錄構建:

\

go run ./calculator 

go build ./calculator 

擴展結構

隨著專案增長,你通常會看到這種模式:

project-name/ │ ├── cmd/        → 可執行檔案(主入口點) ├── internal/   → 私有程式碼(不供外部使用) ├── pkg/        → 可重用套件 ├── api/        → API 定義(gRPC、OpenAPI 等) └── go.mod 

對於初學者來說,這可能有點過頭。但當你進入網頁應用、服務或 MLOps 工具時,這種佈局變得至關重要。


我正在學習的最佳實踐

  • 保持套件小而專注
  • 使用有意義的名稱(calc、parser、storage)
  • 不要過度設計 — 從簡單開始,之後重構
  • 避免循環依賴(Go 強制執行這一點)

從計算器專案中學到的教訓

  • 將邏輯(operations.go)與入口點(main.go)分離使測試更容易。
  • 錯誤處理(如除以零)應該明確。
  • 導入路徑非常重要 — 尤其是使用 internal 時。

我將繼續分享我在探索 Go 用於MLOps 和後端開發時學到的內容。接下來:Go 中的錯誤處理和測試。

\ 👉 在這裡查看我的儲存庫:https://github.com/turman17/GoLang-progress

敬請期待下一篇文章!

免責聲明: 本網站轉載的文章均來源於公開平台,僅供參考。這些文章不代表 MEXC 的觀點或意見。所有版權歸原作者所有。如果您認為任何轉載文章侵犯了第三方權利,請聯絡 crypto.news@mexc.com 以便將其刪除。MEXC 不對轉載文章的及時性、準確性或完整性作出任何陳述或保證,並且不對基於此類內容所採取的任何行動或決定承擔責任。轉載材料僅供參考,不構成任何商業、金融、法律和/或稅務決策的建議、認可或依據。

$30,000 等值 PRL + 15,000 USDT

$30,000 等值 PRL + 15,000 USDT$30,000 等值 PRL + 15,000 USDT

充值並交易 PRL,即可提升您的獎勵!