| <!--{ | |
| "Title": "Call your code from another module", | |
| "Breadcrumb": true | |
| }--> | |
| <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> |