| <!--{ |
| "Title": "Call your code from another module" |
| }--> |
| |
| <p> |
| In the <a href="/doc/tutorial/create-module.html">previous section</a>, you created a |
| <code>greetings</code> module. In this section, you'll write code to make |
| calls to the <code>Hello</code> function in the module you just wrote. You'll |
| write code you can execute as an application, and which calls code in the |
| <code>greetings</code> module. |
| </p> |
| |
| <aside class="Note"> |
| <strong>Note:</strong> This topic is part of a multi-part tutorial that begins |
| with <a href="/doc/tutorial/create-module.html">Create a Go module</a>. |
| </aside> |
| |
| <ol> |
| <li> |
| Create a <code>hello</code> directory for your Go module source code. This |
| is where you'll write your caller. |
| |
| <p> |
| After you create this directory, you should have both a hello and a |
| greetings directory at the same level in the hierarchy, like so: |
| </p> |
| <pre><home>/ |
| |-- greetings/ |
| |-- hello/</pre> |
| |
| <p> |
| For example, if your command prompt is in the greetings directory, you |
| could use the following commands: |
| </p> |
| |
| <pre> |
| cd .. |
| mkdir hello |
| cd hello |
| </pre |
| > |
| </li> |
| |
| <li> |
| Enable dependency tracking for the code you're about to write. |
| |
| <p> |
| To enable dependency tracking for your code, run the |
| <a |
| href="/ref/mod#go-mod-init" |
| ><code>go mod init</code> command</a>, giving it the name of the module |
| your code will be in.</p> |
| |
| <p> |
| For the purposes of this tutorial, use <code>example.com/hello</code> |
| for the module path. |
| </p> |
| |
| <pre> |
| $ go mod init example.com/hello |
| go: creating new go.mod: module example.com/hello |
| </pre> |
| </li> |
| |
| <li> |
| In your text editor, in the hello directory, create a file in which to |
| write your code and call it hello.go. |
| </li> |
| |
| <li> |
| Write code to call the <code>Hello</code> function, then print the |
| function's return value. |
| |
| <p> |
| To do that, paste the following code into hello.go. |
| </p> |
| |
| <pre> |
| package main |
| |
| import ( |
| "fmt" |
| |
| "example.com/greetings" |
| ) |
| |
| func main() { |
| // Get a greeting message and print it. |
| message := greetings.Hello("Gladys") |
| fmt.Println(message) |
| } |
| </pre> |
| |
| <p> |
| In this code, you: |
| </p> |
| |
| <ul> |
| <li> |
| Declare a <code>main</code> package. In Go, code executed as an |
| application must be in a <code>main</code> package. |
| </li> |
| <li> |
| Import two packages: <code>example.com/greetings</code> and |
| the <a href="https://pkg.go.dev/fmt/"><code>fmt</code> package</a>. This |
| gives your code access to functions in those packages. Importing |
| <code>example.com/greetings</code> (the package contained in the module |
| you created earlier) gives you access to the <code>Hello</code> |
| function. You also import <code>fmt</code>, with functions for handling |
| input and output text (such as printing text to the console). |
| </li> |
| <li> |
| Get a greeting by calling the <code>greetings</code> package’s |
| <code>Hello</code> function. |
| </li> |
| </ul> |
| </li> |
| |
| <li> |
| Edit the <code>example.com/hello</code> module to use your local |
| <code>example.com/greetings</code> module. |
| |
| <p> |
| For production use, you’d publish the <code>example.com/greetings</code> |
| module from its repository (with a module path that reflected its published |
| location), where Go tools could find it to download it. |
| For now, because you haven't published the module yet, you need to adapt |
| the <code>example.com/hello</code> module so it can find the |
| <code>example.com/greetings</code> code on your local file system. |
| </p> |
| |
| <p> |
| To do that, use the |
| <a href="/ref/mod#go-mod-edit"><code>go |
| mod edit</code> command</a> to edit the <code>example.com/hello</code> |
| module to redirect Go tools from its module path (where the module isn't) |
| to the local directory (where it is). |
| </p> |
| |
| <ol> |
| <li> |
| From the command prompt in the hello directory, run the following |
| command: |
| |
| <pre> |
| $ go mod edit -replace example.com/greetings=../greetings |
| </pre> |
| |
| <p> |
| The command specifies that <code>example.com/greetings</code> should be |
| replaced with <code>../greetings</code> for the purpose of locating the |
| dependency. After you run the command, the go.mod file in the hello |
| directory should include a <a href="/doc/modules/gomod-ref#replace"> |
| <code>replace</code> directive</a>: |
| </p> |
| |
| <pre> |
| module example.com/hello |
| |
| go 1.16 |
| |
| <ins>replace example.com/greetings => ../greetings</ins> |
| </pre> |
| </li> |
| |
| <li> |
| From the command prompt in the hello directory, run the |
| <a href="/ref/mod#go-mod-tidy"> |
| <code>go mod tidy</code> command</a> to synchronize the |
| <code>example.com/hello</code> module's dependencies, adding those |
| required by the code, but not yet tracked in the module. |
| |
| <pre>$ go mod tidy |
| go: found example.com/greetings in example.com/greetings v0.0.0-00010101000000-000000000000 |
| </pre> |
| <p> |
| After the command completes, the <code>example.com/hello</code> |
| module's go.mod file should look like this: |
| </p> |
| |
| <pre>module example.com/hello |
| |
| go 1.16 |
| |
| replace example.com/greetings => ../greetings |
| |
| <ins>require example.com/greetings v0.0.0-00010101000000-000000000000</ins></pre> |
| |
| <p> |
| The command found the local code in the greetings directory, then |
| added a <a href="/doc/modules/gomod-ref#require"><code>require</code> |
| directive</a> to specify that <code>example.com/hello</code> |
| requires <code>example.com/greetings</code>. You created this |
| dependency when you imported the <code>greetings</code> package in |
| hello.go. |
| </p> |
| <p> |
| The number following the module path is a <em>pseudo-version number</em> |
| -- a generated number used in place of a semantic version number (which |
| the module doesn't have yet). |
| </p> |
| <p> |
| To reference a <em>published</em> module, a go.mod file would |
| typically omit the <code>replace</code> directive and use a |
| <code>require</code> directive with a tagged version number at the end. |
| </p> |
| |
| <pre>require example.com/greetings v1.1.0</pre> |
| |
| <p>For more on version numbers, see |
| <a href="/doc/modules/version-numbers">Module version numbering</a>.</p> |
| </li> |
| </ol> |
| <li> |
| At the command prompt in the <code>hello</code> directory, run your code to |
| confirm that it works. |
| |
| <pre> |
| $ go run . |
| Hi, Gladys. Welcome! |
| </pre> |
| </li> |
| </ol> |
| |
| <p> |
| Congrats! You've written two functioning modules. |
| </p> |
| |
| <p> |
| In the next topic, you'll add some error handling. |
| </p> |
| |
| <p class="Navigation"> |
| <a class="Navigation-prev" href="/doc/tutorial/create-module.html" |
| >< Create a Go module</a |
| > |
| <a class="Navigation-next" href="/doc/tutorial/handle-errors.html" |
| >Return and handle an error ></a |
| > |
| </p> |