Goの初心者が見ると幸せになれる場所　#golang

## [公式サイト](https://go.dev)

### [A Tour of Go](https://go.dev/tour)

Web上で実行しながら学ぶことができる公式のチュートリアルです。

### [チュートリアル](https://go.dev/doc/tutorial)

公式のチュートリアルです。初学者向けからジェネリクスのチュートリアルなども用意されています。
A Tour of Goが終わった後に取り組むと良いでしょう。

### [Go Wiki](https://go.dev/wiki)

[Go Code Review Comments](https://go.dev/wiki/CodeReviewComments)などが掲載されているGitHub上のWikiです。

### [パッケージドキュメント](https://pkg.go.dev)

[標準パッケージ](https://pkg.go.dev/std)やサードパーティ製のパッケージのドキュメントが見れるサイトです。検索もできます。

## 入門

### [プログラミング言語Go完全入門](https://tenn.in/go)

筆者が作っている巨大なGoの入門資料です。なぜGoが作られたのか、から最新のジェネリクスの情報、静的解析まで扱っています。

### [Gopher道場](https://gopherdojo.org)

Goを体系的に学べる場です。10時間くらいある動画教材（[自習室](https://gopherdojo.org/studyroom/)から入手可）もあります。

### [Go の最初の手順](https://docs.microsoft.com/ja-jp/learn/paths/go-first-steps/)

Microsoftが公開している以下の内容が掲載された入門資料です。

* Go の使用を開始する
* Go でのパッケージ、変数、関数の使用方法を理解する
* Go で制御フローを使用する
* Go のデータ型、構造体、配列、スライス、マップを使用する
* Go でのエラー処理とログ記録を実装する
* Go でメソッドとインターフェイスを使用する
* Go でプログラムを作成してテストする

### [Goとは？特徴や仕事に使うことを目指すための勉強法などを解説](https://freelance.levtech.jp/guide/detail/1424/)

これからGoを始める方向けの記事です。

### これからはじめるGo - tenntenn Conference 2022（[資料](https://tenn.in/conn22-keynote) / [動画](https://tenn.in/conn22-keynote-video)）

Goをこれから始めるための動画資料です。

## よいコードを書くために

### [Go Proverbs](https://go-proverbs.github.io/)
Rob Pike氏のGoの格言をまとめたサイトです。

### [Go Code Review Comments](https://go.dev/wiki/CodeReviewComments)（[日本語訳](https://knsh14.github.io/translations/go-codereview-comments/))

Goの良いコードが書かれたページです。

## コミュニティ

### [Slack-Gophers](http://blog.gopheracademy.com/gophers-slack-community/)
Slackのコミュニティです。`#japan`や`#tokyo`には日本語話者がいるので、日本語で質問しやすい。この他にも分野や地域ごとにチャンネルがあります。

## 書籍

### [Books for Gophers - Go Conference 2022 Spring](https://miro.com/app/board/uXjVOFumO24=/)

書籍の情報をまとめたものです。

## エディタ／IDE

普段使ってるエディタやIDEのGoプラグインを使うと良いでしょう。特にない場合はVisual Studio Codeをオススメします。

### [Visual Studio Code](https://code.visualstudio.com/)

[Goの公式](https://go.dev/blog/vscode-go)でプラグインが用意されています。インストールも簡単で.goファイルを開くとプラグインのインストールが促されます。

* [Visual Studio Codeで書くプログラミング言語Go（動画）](https://youtu.be/iMiBW6yfLWw)
* [Go 開発用に Visual Studio Code を構成する](https://docs.microsoft.com/ja-jp/azure/developer/go/configure-visual-studio-code)

## よくある質問

〇〇が無いのはなぜ？などの疑問を持った場合は、[公式のFAQ](https://go.dev/doc/faq)を参考にすると良いでしょう。

### 〇〇envは必要か？

[Goでは○○envが不要になった理由（バージョンアップを怠ると損する理由）](https://zenn.dev/tenntenn/articles/676a32ab3d4aab)を読んでください。現在のGoのバージョン（Go1.18）では端的に言うとほとんどの場合不要です。

Goは、ツールチェイン（コンパイルなど）を公式サイトからダウンロードし、お好きなエディタ（オススメはVisual Studio Code）を用意するだけで始められます。Gitも必要になることもありますが、他は必要になった時点でインストールすれば十分です。

### 環境変数の設定

不要です。GOPATHやGOROOTに言及している記事は基本的に古いことが多いです。無くなった訳ではありませんが、ほとんど設定することはなくなりました。

環境変数の意味を理解せずに設定するのはどちらにせよ危ないので、ほとんどありませんが、必要になったときに設定しましょう。

Goを始める際におまじない的に設定するものはありません。

### プロジェクトの作り方

最初に`go mod init`コマンドを実行しましょう。Goはモジュールという単位でプロジェクトを管理します。

以下のように、モジュールパスを指定してコマンドを実行します。`$`はターミナルのプロンプトを表しているので入力は不要です。

```
$ go mod init github.com/tenntenn/mymodule
```

`github.com/tenntenn/mymodule`の部分がモジュールパスです。サンプルコードや殴り書きのコード以外はGitHubなどのリポジトリのパスにしておきましょう。

`go mod init`コマンドを実行したら、`go.mod`ファイルができます。モジュールの情報や依存するモジュールのバージョンなどが記載されます。

あとはコードを書いて`go build`コマンドまたは`go run`コマンドでコンパイルして実行しましょう。

標準パッケージ以外を使ってる場合は、ソースコードに`import`宣言を書き、`go mod tidy`コマンドを実行すると、`go.mod`ファイルに依存関係が追加されます。

標準パッケージ以外を使っている場合、`go.sum`ファイルが作成されます。これはチェクサムの情報が記録されたものです。`go.mod`ファイルや他のソースコードと共にコミットしておきましょう。

### ディレクトリ構成

[Standard Go Project Layout](https://github.com/golang-standards/project-layout)を参照している記事を多く見かけますが、これは標準ではありません。Goチームのメンバーから[指摘](https://github.com/golang-standards/project-layout/issues/117)も入っています。

学習中はパッケージ（ディレクトリ）はディレクトリ1つのシンプルな構成で始めると良いと思います。コマンドラインツールであれば、次のような構成をよく見かけます。

```
.
├── go.mod
├── internal
│   └── a.go
└── main.go
```

ライブラリとしての機能がメインの場合は以下のような構成にするのも見かけます。`cmd`ディレクトリ以下にツール名をつけたディレクトリを置き、その中に`main.go`を置きます。

```
.
├── a.go
├── cmd
│   └── mytool
│       └── main.go
└── go.mod
```

APIサーバやWebアプリケーションの場合はもう少し複雑な構成になると思います。それなりの規模で公開されているものであれば、[pkg.go.dev](https://pkg.go.dev)の[ソースコード](https://cs.opensource.google/go/x/pkgsite)も参考になります。

作るものや開発チームが変われば適切なディレクトリ構成も変わります。適切なディレクトリ構成もプロダクトのフェーズによって変わる場合もあるでしょう。チームや企業内で模索するものであり、言語で標準が決まっているものではないのかなと考えています。

とはいえ、パッケージ構成を考える際のポイントとしては、パッケージの利用者の立場になって考えることです。[「Goに入ってはGoに従え」](https://ukai-go-talks.appspot.com/2014/gocon.slide#24)にあるように、命名は与えられたコンテキスト（文脈）の中で分かりやすいものにすると良いとされています。パッケージ構成はこのコンテキストを作ることになるため、パッケージ名が長くなり、コンテキストがうまく組み立てられていない場合はパッケージ構成が良くないといえるでしょう。