• English
  • 多模組工作區入門

    本教學介紹了 Go 中多模組工作區的基本概念。使用多模組工作區,您可以告訴 Go 命令您同時在多個模組中撰寫程式碼,並輕鬆建置和執行這些模組中的程式碼。

    在本教學中,您將在共用的多模組工作區中建立兩個模組,在這些模組之間進行修改,並在建置時觀察這些更改的結果。

    先決條件

    • 安裝 Go 1.18 或更高版本
    • 程式碼編輯工具:任何您習慣的文字編輯器皆可
    • 命令終端機:Go 在 Linux/Mac 的終端機或 Windows 的 PowerShell/cmd 上皆能正常運作

    本教學需要 Go 1.18 或更高版本。請確認您已從 go.dev/dl 安裝正確版本。

    建立程式碼模組

    1. 開啟命令提示字元並切換至主目錄:

      Linux/Mac:

      $ cd

      Windows:

      C:\> cd %HOMEPATH%

      後續命令提示將以 $ 顯示,所有命令均相容 Windows。

    2. 建立 workspace 工作目錄:

      $ mkdir workspace
      $ cd workspace
    3. 初始化模組:

      本範例將建立新的 hello 模組並相依於 golang.org/x/example 模組:

      $ mkdir hello
      $ cd hello
      $ go mod init example.com/hello
      go: creating new go.mod: module example.com/hello

      透過 go get 加入相依套件:

      $ go get golang.org/x/example/hello/reverse

      建立 hello.go 內容如下:

      package main
      
      import (
          "fmt"
          "golang.org/x/example/hello/reverse"
      )
      
      func main() {
          fmt.Println(reverse.String("Hello"))
      }

      執行程式:

      $ go run .
      olleH

    建立工作區

    此步驟將建立 go.work 檔案來指定模組的工作區配置。

    初始化工作區

    workspace 目錄執行:

    $ go work init ./hello

    此命令會建立類似以下內容的 go.work 檔案:

    go 1.18
    
    use ./hello

    語法說明:

    • go 1.18:指定 Go 版本要求
    • use ./hello:指定 hello 目錄為主模組

    在工作區執行程式

    workspace 目錄執行:

    $ go run ./hello
    olleH

    Go 命令會將工作區中所有模組視為主模組。這允許我們在模組外仍可參考模組中的套件。若在非模組或工作區外執行 go run 會導致錯誤。

    下載並修改 golang.org/x/example/hello 模組

    1. 複製 Git 倉庫:

      $ git clone https://go.googlesource.com/example
    2. 將模組加入工作區:

      $ go work use ./example/hello

      更新後的 go.work

      go 1.18
      
      use (
          ./hello
          ./example/hello
      )
    3. 新增函數功能:

      workspace/example/hello/reverse 目錄建立 int.go

      package reverse
      
      import "strconv"
      
      // Int 反轉整數 i 的十進位數字順序
      func Int(i int) int {
          i, _ = strconv.Atoi(String(strconv.Itoa(i)))
          return i
      }
    4. 修改 hello.go 使用新函數:

      package main
      
      import (
          "fmt"
          "golang.org/x/example/hello/reverse"
      )
      
      func main() {
          fmt.Println(reverse.String("Hello"), reverse.Int(24601))
      }

    執行工作區程式

    $ go run ./hello
    olleH 10642

    工作區機制說明:

    • 使用 go.work 解析模組路徑,無需設定 replace 指令
    • 同一工作區內的模組可即時互相參考修改

    後續發行步驟

    若需正式發行模組:

    1. golang.org/x/example/hello 模組建立 v0.1.0 標籤
    2. 詳見模組發行流程文件
    3. 更新 hello/go.mod 的版本需求:
      cd hello
      go get golang.org/x/example/hello@v0.1.0

    工作區進階指令

    Go 提供多個工作區管理子命令:

    • go work use [-r] [dir]:加入或移除 use 目錄,-r 參數會遞迴檢查子目錄
    • go work edit:編輯 go.work 檔案(類似 go mod edit
    • go work sync:將工作區相依套件同步至各模組

    詳細資訊請參閱 Go 模組參考文件 - 工作區