<!--{
    "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="/ref/mod#go-mod-file-replace">
            <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="/ref/mod#go-mod-file-require">
            <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>
