242 строки
7.0 KiB
HTML
242 строки
7.0 KiB
HTML
<!--{
|
||
"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>
|