這一章介紹Go語言多模塊工作空間的基礎概念,我們會在共享的多模塊工作空間創(chuàng)建兩個模塊并修改它們,從而在構(gòu)建程序過程中觀察它們的變化撼玄。
前提條件
- Go語言版本1.18或更新
- 代碼編輯工具
- 命令行終端
創(chuàng)建第一個模塊
- 在根目錄創(chuàng)建一個名為workspace的目錄,并且在workspace目錄下創(chuàng)建hello目錄,并且在hello目錄下使用go mod init初始化hello模塊
$ cd
$ mkdir workspace
$ cd workspace
$ mkdir hello
$ cd hello
$ go mod init example.com/hello
我們要創(chuàng)建一個依賴于golang.org/x/example模塊的hello模塊,所以要先獲取golang.org/x/example模塊到本地,(這一步操作需要在hello目錄下執(zhí)行,因為go get 首先會要在當前目錄找到go.mod-go mod init命令生成禾唁,否則會報錯)
$ go get golang.org/x/example
- 編寫hello.go代碼如下:
package main
import (
"fmt"
"golang.org/x/example/stringutil"
)
func main() {
fmt.Println(stringutil.Reverse("Hello")) //調(diào)用example模塊中stringutil包里的reverse()方法對字符串進行翻轉(zhuǎn)
}
執(zhí)行g(shù)o run命令得到一下輸出結(jié)果:
$ go run example.com/hello
olleH
創(chuàng)建工作空間
上面我們只是創(chuàng)建了一個名為workspace的目錄,要創(chuàng)建Go語言的工作空間需要執(zhí)行g(shù)o work init命令些膨,它會生成一個go.work文件
在workspace目錄執(zhí)行g(shù)o work init ./hello命令
$ go work init ./hello
go work init命令會在workspace目錄下生成一個名為go.work的文件蟀俊,它的語法類似go.mod,它告訴Go語言編譯器創(chuàng)建一個包含了hello目錄下的模塊的go.wor文件订雾。go.work文件指出了當前的workspace引用了哪些目錄下的模塊肢预。
它的內(nèi)容如下:
go 1.18
use (
./example
./hello
)
當工作空間初始化完成之后,你就可以在workspace目錄下執(zhí)行g(shù)o run example.com/hello命令洼哎,并能得到和在hello目錄下執(zhí)行一樣的結(jié)果烫映。
下一節(jié)我們要下載golang.org/x/example模塊的Git倉庫到本地并且添加到我們的工作空間中進行修改,再用我們自己創(chuàng)建的模塊來訪問修改的內(nèi)容噩峦。
下載并修改golang.org/x/example模塊
- 使用git clone從Git倉庫下載golang.org/x/example模塊到本地(由于眾所周的原因go.googlesource.com/example下載不了锭沟,把go.googlesource.com替換成github.com/golang的地址就可以了),在workspace目錄下執(zhí)行下面的命令:(可是有時候github也會訪問不了识补,可以用它的替換地址:https://hub.fastgit.xyz)(這里有一點我還沒有完全搞清楚:用git clone下載到本地族淮,和前一章使用go get更新go.mod文件的區(qū)別是否是go get更新go.mod文件運行程序時,會在線加載example模塊的代碼,而git clone加載的是本地代碼祝辣?)
$ git clone https://github.com/golang/example
$ git clone https://hub.fastgit.xyz/golang/example
- 在下載到本地的example/stringutil目錄下新建一個go文件toupper.go贴妻,用來對輸入的字母進行大寫轉(zhuǎn)換
package stringutil
import "unicode"
// ToUpper uppercases all the runes in its argument string.
func ToUpper(s string) string {
r := []rune(s)
for i := range r {
r[i] = unicode.ToUpper(r[i])
}
return string(r)
}
- 然后我們在hello.go中調(diào)用新創(chuàng)建的ToUpper()函數(shù)
package main
import (
"fmt"
"golang.org/x/example/stringutil"
)
func main() {
fmt.Println(stringutil.ToUpper("Hello"))
}
- 執(zhí)行g(shù)o run命令觀察輸入結(jié)果:
$ go run example.com/hello
HELLO
go.work可以被用來代替replace命令來處理多模塊調(diào)用。
更多詳細的關(guān)于工作空間的內(nèi)容請參考 :Workspaces