• English
  • 從其他模組呼叫你的程式碼

    注意: 本文是系列教學的一部分,該系列始於 建立 Go 模組

    上一節 中,你建立了一個 greetings 模組。在本節中,你將撰寫程式碼來呼叫你剛剛撰寫的模組中的 Hello 函數。你將撰寫可以作為應用程式執行的程式碼,並呼叫 greetings 模組中的程式碼。

    步驟

    1. 為你的 Go 模組原始碼建立一個 hello 目錄

    這是你將撰寫呼叫者的位置。

    建立此目錄後,你的目錄結構應如下所示,hellogreetings 目錄在同一層級:

    <home>/
     |-- greetings/
     |-- hello/

    例如,如果你的命令提示符在 greetings 目錄中,你可以使用以下命令:

    cd ..
    mkdir hello
    cd hello

    2. 為你即將撰寫的程式碼啟用依賴追蹤

    為了啟用程式碼的依賴追蹤,請執行 go mod init 命令,並為其提供你的程式碼將所在的模組名稱。

    在本教學中,請使用 example.com/hello 作為模組路徑。

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

    3. 建立一個名為 hello.go 的檔案

    在你的文字編輯器中,在 hello 目錄中建立一個用於撰寫程式碼的檔案,並命名為 hello.go

    4. 撰寫程式碼以呼叫 Hello 函數並列印返回值

    為此,將以下程式碼貼上到 hello.go 中:

    package main
    
    import (
        "fmt"
    
        "example.com/greetings"
    )
    
    func main() {
        // 取得問候語並列印。
        message := greetings.Hello("Gladys")
        fmt.Println(message)
    }

    在這段程式碼中,你:

    • 宣告一個 main 套件。在 Go 中,作為應用程式執行的程式碼必須在 main 套件中。
    • 匯入兩個套件:example.com/greetingsfmt 套件。這為你的程式碼提供了存取這些套件中函數的權限。匯入 example.com/greetings(你之前建立的模組中包含的套件)使你能夠存取 Hello 函數。你還匯入了 fmt,它包含處理輸入和輸出文字的函數(例如將文字列印到主控台)。
    • 透過呼叫 greetings 套件的 Hello 函數取得問候語。

    5. 編輯 example.com/hello 模組以使用本地的 example.com/greetings 模組

    在生產環境中,你可以從其程式碼庫發布 example.com/greetings 模組(模組路徑應反映其發布位置),Go 工具可以找到它並下載。目前,由於你尚未發布該模組,你需要調整 example.com/hello 模組,以便它能在本地檔案系統中找到 example.com/greetings 的程式碼。

    為此,使用 go mod edit 命令 編輯 example.com/hello 模組,將 Go 工具從其模組路徑(模組不存在的地方)重定向到本地目錄(模組存在的地方)。

    a. 替換模組路徑

    hello 目錄的命令提示符下,執行以下命令:

    $ go mod edit -replace example.com/greetings=../greetings

    該命令指定在定位依賴項時,example.com/greetings 應替換為 ../greetings。執行命令後,hello 目錄中的 go.mod 檔案應包含一個 replace 指令

    module example.com/hello
    
    go 1.16
    
    replace example.com/greetings => ../greetings

    b. 同步依賴項

    hello 目錄的命令提示符下,執行 go mod tidy 命令 以同步 example.com/hello 模組的依賴項,新增程式碼所需但尚未在模組中追蹤的依賴項。

    $ go mod tidy
    go: found example.com/greetings in example.com/greetings v0.0.0-00010101000000-000000000000

    命令完成後,example.com/hello 模組的 go.mod 檔案應如下所示:

    module example.com/hello
    
    go 1.16
    
    replace example.com/greetings => ../greetings
    
    require example.com/greetings v0.0.0-00010101000000-000000000000

    該命令在 greetings 目錄中找到了本地程式碼,然後加入了一個 require 指令,指定 example.com/hello 需要 example.com/greetings。你在 hello.go 中匯入 greetings 套件時建立了此依賴關係。

    模組路徑後的數字是一個 偽版本號 —— 產生的數字,用於替代語意版本號(該模組尚未有)。

    要引用一個 已發布 的模組,go.mod 檔案通常會省略 replace 指令,並使用帶有標記版本號的 require 指令。

    require example.com/greetings v1.1.0

    有關版本號的更多資訊,請參閱 模組版本編號

    6. 執行你的程式碼以確認其是否正常運作

    hello 目錄的命令提示符下,執行你的程式碼:

    $ go run .
    Hi, Gladys. Welcome!

    結論

    恭喜!你已經撰寫了兩個功能正常的模組。

    在接下來的下一個主題中,你將加入一些錯誤處理。