| <!--{ |
| "Title": "Call your code from another module", |
| "Path": "/doc/tutorial/call-module-code" |
| }--> |
| |
| <p> |
| In the <a href="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="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> |
| For example, if your current directory in the command prompt is the |
| greetings directory, you could use the following commands: |
| </p> |
| |
| <pre> |
| cd .. |
| mkdir hello |
| cd 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 go in a <code>main</code> package. |
| </li> |
| <li> |
| Import two packages: <code>example.com/greetings</code> and |
| <code>fmt</code>. 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> |
| Create a new module for this hello package. |
| |
| <p> |
| From the command line at the hello directory, run the |
| <code>go mod init</code> command, giving it the name of the module your |
| code will be in (here, just use "hello"). |
| </p> |
| |
| <pre> |
| $ go mod init hello |
| go: creating new go.mod: module hello |
| </pre |
| > |
| </li> |
| |
| <li> |
| Edit the <code>hello</code> module to use the unpublished greetings module. |
| |
| <p> |
| For production use, you’d publish your modules on a server, either inside |
| your company or on the internet, and the Go command will download them |
| from there. For now, you need to adapt the caller's module so it can find |
| the greetings code on your local file system. |
| </p> |
| |
| <p> |
| To do that, make a small change to <code>hello</code> module’s go.mod |
| file. |
| </p> |
| |
| <ol> |
| <li> |
| In the hello directory, open the go.mod file, change it so that it looks |
| like the following, and save the file. |
| |
| <pre> |
| module hello |
| |
| go 1.14 |
| |
| <ins>replace example.com/greetings => ../greetings</ins> |
| </pre> |
| |
| <p> |
| Here, the |
| <a href="https://golang.org/ref/mod#tmp_15" |
| ><code>replace</code> directive</a |
| > |
| tells Go to replace the module path (the URL |
| <code>example.com/greetings</code>) with a path you specify. In this |
| case, that's a greetings directory next to the hello directory. |
| </p> |
| </li> |
| |
| <li> |
| In the hello directory, run <code>go build</code> to make Go locate the |
| module and add it as a dependency to the go.mod file. |
| |
| <pre> |
| $ go build |
| go: found example.com/greetings in example.com/greetings v0.0.0-00010101000000-000000000000 |
| </pre |
| > |
| </li> |
| |
| <li> |
| Look at go.mod again to see the changes made by <code>go build</code>, |
| including the <code>require</code> directive Go added. |
| |
| <pre> |
| module hello |
| |
| go 1.14 |
| |
| replace example.com/greetings => ../greetings |
| |
| <ins>require example.com/greetings v0.0.0-00010101000000-000000000000</ins> |
| </pre> |
| |
| <p> |
| To build the module, Go found the local code in the ../greetings |
| directory, then added a |
| <a href="https://golang.org/ref/mod#tmp_13" |
| ><code>require</code> directive</a |
| > |
| to specify that <code>hello</code> is dependent on (requires) |
| <code>example.com/greetings</code>. You created this dependency when |
| you imported the <code>greetings</code> package (contained in the |
| greetings module) in hello.go. The <code>replace</code> directive |
| tells Go where to find the <code>greetings</code> module, because it |
| isn't published yet. |
| </p> |
| |
| <p> |
| To reference a published module, a go.mod file would 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> |
| </li> |
| </ol> |
| </li> |
| |
| <li> |
| In the <code>hello</code> directory, run the <code>hello</code> executable |
| (created by <code>go build</code>) to confirm that the code works. |
| <ul> |
| <li> |
| On Linux or Mac: |
| |
| <pre> |
| $ ./hello |
| Hi, Gladys. Welcome! |
| </pre |
| > |
| </li> |
| |
| <li> |
| On Windows: |
| |
| <pre> |
| $ hello.exe |
| Hi, Gladys. Welcome! |
| </pre |
| > |
| </li> |
| </ul> |
| </li> |
| </ol> |
| |
| <p> |
| Congrats! You've written two functioning modules. In the tutorial's |
| <a href="handle-errors.html">next topic</a>, you'll add some error handling. |
| </p> |
| |
| <p class="Navigation"> |
| <a class="Navigation-prev" href="create-module.html" |
| >< Create a Go module</a |
| > |
| <a class="Navigation-next" href="handle-errors.html" |
| >Return and handle an error ></a |
| > |
| </p> |