チュートリアル: Go言語をはじめよう

:::note info
このページは、[Tutorial: Get started with Go](https://go.dev/doc/tutorial/getting-started)ページ(2023-05-31時点の記事)を翻訳したものです。
:::

# チュートリアル: Go言語をはじめよう

### 目次:
- 前提条件
- Goをインストールする
- コードを書く
- 外部パッケージのコードを呼び出す
- さらにコードを書く


このチュートリアルでは、Goプログラミングの簡単な紹介をします。その過程で、あなたは

- Goをインストールします（まだインストールしていない場合）。
- 簡単な「Hello, world」コードを書きます。
- コードを実行するためにgoコマンドを使用します。
- パッケージを検索するツールを使って、自分のコードで使用できるパッケージを見つけます。
- 外部モジュールの関数を呼び出します。

その他のチュートリアルは[チュートリアル](https://go.dev/doc/tutorial/index.html)をご覧ください。

# 前提条件
- 何らかのプログラミングの経験があること。ここでのコードはとてもシンプルですが、関数について知っていると役に立ちます。
- コードを編集するためのツール。あなたが持っているテキストエディタであれば、どんなものでも問題なく使えます。ほとんどのテキストエディタは、Goをよくサポートしています。VSCode（無料）、GoLand（有料）、Vim（無料）が代表的です。
- コマンドターミナル。LinuxやMacではターミナルを、WindowsではPowerShellやcmdを使うと、Goはうまく動作します。

# Goをインストールする
[ダウンロードとインストール](https://go.dev/doc/install)の手順でOKです。

# コードを書く

Hello, Worldを始めましょう。

##### 1. コマンドプロンプトを開き、ホームディレクトリにcdします。
LinuxまたはMacの場合：

```
cd
```

Windowsの場合

```
cd %HOMEPATH%
```

です。

##### 2. 最初のGoソースコード用にhelloディレクトリを作成します。
例えば、次のようなコマンドを使用します: 

```
mkdir hello
cd hello
```

##### 3. コードの依存性追跡を有効にします。

あなたのコードが他のモジュールに含まれるパッケージをインポートする場合、その依存関係をあなたのコード自身のモジュールで管理します。このモジュールは、パッケージを提供するモジュールを追跡するgo.modファイルによって定義されます。このgo.modファイルは、ソースコードリポジトリを含め、あなたのコードと一緒に残ります。

go.modファイルを作成してコードの依存性追跡を有効にするには、[go mod initコマンド](https://go.dev/ref/mod#go-mod-init)を実行し、あなたのコードが入るモジュールの名前を与えます。この名前は、モジュールのモジュールパスです。

実際の開発では、モジュールパスは通常、ソースコードが保存されているリポジトリの場所となります。例えば、モジュールパスはgithub.com/mymoduleのようなものです。他の人が使えるようにモジュールを公開する場合、モジュールパスはGoツールがモジュールをダウンロードできる場所でなければなりません。モジュールパスによるモジュールの命名の詳細については、[依存関係の管理](https://go.dev/doc/modules/managing-dependencies#naming_module) を参照してください。

このチュートリアルでは、example/helloを使うだけで構いません。

```
$ go mod init example/hello
go: creating new go.mod: module example/hello
```

##### 4. テキストエディタで、コードを書くためのファイルhello.goを作成します。

##### 5. 以下のコードをhello.goファイルに貼り付け、ファイルを保存してください。

```golang
package main

import "fmt"

func main() {
    fmt.Println("Hello, World!")
}
```

これは、あなたのGoコードです。このコードで、あなたは

  - メインパッケージを宣言します（パッケージは関数をグループ化する方法であり、同じディレクトリにあるすべてのファイルから構成されます）。
  - コンソールへの出力など、テキストをフォーマットするための関数が含まれている、人気のあるfmtパッケージをインポートします。このパッケージは、Goをインストールしたときに入手した標準ライブラリパッケージの1つです。
  - コンソールにメッセージを表示するためのmain関数を実装します。main関数は、mainパッケージの実行時にデフォルトで実行されます。

##### 6. コードを実行すると、挨拶が表示されます。

```
$ go run .
Hello, World!
```

# 外部パッケージのコードを呼び出す
誰かが実装したようなことを自分のコードで行う必要がある場合、自分のコードで使用できる関数を持つパッケージを探すことができます。

##### 1. 外部モジュールの機能を使って、出力されるメッセージをもう少し面白くしてみませんか？

  - pkg.go.dev にアクセスし、[「quote」パッケージを検索](https://pkg.go.dev/search?q=quote)します。
  - 検索結果でrsc.io/quoteパッケージを見つけ、クリックします（rsc.io/quote/v3が表示されたら、今は無視します）。
  -  Documentation セクションの Indexの下に、コードから呼び出せる関数のリストがあることに注意してください。あなたはGo関数を使用することになります。
  - このページのトップで、パッケージのquoteがrsc.io/quoteモジュールに含まれていることに注目してください。

pkg.go.devサイトでは、自分のコードで使える機能を持つパッケージが公開されているモジュールを見つけることができます。パッケージは、rsc.io/quoteのようなモジュールで公開され、他の人がそれを使うことができます。モジュールは時間とともに新しいバージョンに改良され、改良されたバージョンを使うために自分のコードをアップグレードすることができます。

##### 2. Goコードで、rsc.io/quoteパッケージをインポートし、そのGo関数への呼び出しを追加します。

ハイライトされた行を追加した後、あなたのコードには次のようなものが含まれているはずです：

```golang
package main

import "fmt"

import "rsc.io/quote"

func main() {
    fmt.Println(quote.Go())
}
```

##### 3. 新しいモジュールの要件とsumファイルを追加します。

Goは、quoteモジュールを要件として追加し、モジュールの認証に使用するためのgo.sumファイルを追加します。詳しくは、Goモジュールリファレンスの[モジュールの認証](https://go.dev/ref/mod#authenticating)を参照してください。

```
$ go mod tidy
go: finding module for package rsc.io/quote
go: found rsc.io/quote in rsc.io/quote v1.5.2
```

##### 4. コードを実行して、呼び出している関数が生成するメッセージを確認します。

```
$ go run .
Don't communicate by sharing memory, share memory by communicating.
```

あなたのコードがGo関数を呼び出し、コミュニケーションに関する賢いメッセージを表示していることに注目してください。

:::note info
ここで出力される
Don't communicate by sharing memory, share memory by communicating.
の翻訳に関しては、以下の記事が参考になりそうでした。

- [Go格言集に込められた詩情とダブルミーニング](https://techracho.bpsinc.jp/hachi8833/2021_12_02/113591)
:::

go mod tidyを実行したとき、それはあなたがインポートしたパッケージを含むrsc.io/quoteモジュールを探し出し、ダウンロードしました。デフォルトでは、最新バージョン -- v1.5.2-- をダウンロードしました。

# さらにコードを書く

この簡単な紹介で、あなたはGoをインストールし、いくつかの基本的なことを学びました。別のチュートリアルでさらにコードを書くには、[Goモジュールを作成する](https://go.dev/doc/tutorial/create-module.html)をご覧ください。