多模組的救星
概述
Go 1.18 推出了 workspace ,成為官方主推的開發方式,可以方便地同時編輯、編譯、執行多個模組組成的程式 (其實是之前太不方便了)。
現在的專案結構大概長這樣:
- 一個 workspace 資料夾下可以有多個 module 資料夾。
- workspace 資料夾中有個 go.work 來定義底下哪些是要用的 modules。
- module 資料夾中有 go.mod ,定義 module 使用哪些其他的 modules 。
- module 資料夾底下可以有多個 packages 資料夾。
- 同個 package 資料夾底下的 .go 檔案必須是同個 package。
簡單範例
假設我們的 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
/workspace/modA # go mod init modA
/workspace # go work use modA
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 的問題,我也不想找到解方,因為這種解方通常下一版就失效了,問題可能也被解了。