<!--{
    "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(greeting)
}
</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"
    >&lt; Create a Go module</a
  >
  <a class="Navigation-next" href="handle-errors.html"
    >Return and handle an error &gt;</a
  >
</p>
