Golang Workspace

Gary Liao
4 min readJun 17, 2023

多模組的救星

概述

Go 1.18 推出了 workspace ,成為官方主推的開發方式,可以方便地同時編輯、編譯、執行多個模組組成的程式 (其實是之前太不方便了)。

現在的專案結構大概長這樣:

  • 一個 workspace 資料夾下可以有多個 module 資料夾。
  • workspace 資料夾中有個 go.work 來定義底下哪些是要用的 modules。
  • module 資料夾中有 go.mod ,定義 module 使用哪些其他的 modules 。
  • module 資料夾底下可以有多個 packages 資料夾。
  • 同個 package 資料夾底下的 .go 檔案必須是同個 package。

簡單範例

workspace 中有 modA, modB 兩個 modules

假設我們的 workspace 就是 /workspace,我們需要一個初始化的動作:
/workspace # go work init
/workspace/go.work

go 1.20

假設 modB 會被另一個 modA 引用,我們現在建立 modB
/workspace/modB # go mod init modB
/workspace # go work use modB

/workspace/modB/go.mod

module modB

go 1.20

/workspace/modB/modB.go

package modB

func Double(x int) int {
return x * 2
}

接著建立 ModA 引用 modB,無須在 go.mod 做任何宣告:
/workspace/modA # go mod init modA
/workspace # go work use modA
/workspace/modA/go.mod

module modA

go 1.20

/workspace/modA/main.go

package main
import (
"fmt"
"modB" // 引用 modB
)
func main() {
fmt.Println(modB.Double(2)) // 引用 modB
}

最後看看 go.work :
/workspace/go.work

go 1.20

use (
./modA
./modB
)

執行結果

任務完成

VSCode 與 gopls

gopls 是 Google 2021年推出的 Go Language Server ,VSCode 能幫 Go 做linting 或 debug 都不能沒有它。

之所以特別提它,是因為 VSCode 若是在 Windows 上,上面的例子沒問題;但若我的 code 在一個 linux (Alpine) container 中,而 VSCode 連入 container,使用 container 中的 gopls,那麼 VSCode 就會報錯:

但反正 compile 還是會過就對了,所以這是不同系統下 gopls 的問題,我也不想找到解方,因為這種解方通常下一版就失效了,問題可能也被解了。

--

--