Goを真面目に勉強する〜1.Goについて知っておく事〜

# はじめに
Goをはじめて１年半。アウトプットが進まない私が、専門家の@tenntennさんから受けたマンツーマンレッスンの内容をまとめて、Goのスキルアップを目指します。Goの基礎から丁寧に学んでいきます。
記事のまとめは以下の通りで順次作成していきます。
今回は「１.Goについて知っておく事」になります。

## シリーズの一覧
1. Goについて知っておく事（今回）
2. [基本構文](https://qiita.com/bluemon0919/items/2d0e96d330e6c6d96b8d)
3. [関数と型](https://qiita.com/bluemon0919/items/000de655f4ab27ea43ae)
4. [パッケージとスコープ](https://qiita.com/bluemon0919/items/4127ecbcadadd9be2b1c)

## 本記事の内容
今回学ぶ内容は以下の通りです。
新しい言語を学習する上で、その言語が作られた背景を知っている人と知らない人では成長スピードが変わってくると教えてもらったので、今回はGoの特徴を中心に、Goが開発された背景や勉強方法をまとめます。

# Goが開発された背景

**Google内の課題を解決するために開発された**

参考：https://talks.golang.org/2012/splash.article

- 開発速度の低下
    - 開発規模が大きくなるに連れ、現行の言語(C++など)による開発に限界が見え始めた。
    - Goで循環参照が禁止されているのは複雑な依存関係を生み出さない仕組みだろうか。
- マルチコア時代の開発
    - プロセッサの進化によりプロセッサ数が増え、並行性とスケーラビリティが重要になってきた。
    - ゴールーチンやチャネルによりこれらを解決しようとしている。
    - 並行プログラミングとともにガーベッジコレクタも同時に採用している。
- 軽量プログラム言語の盛り上がり
    - Python,Rubyをはじめとするスクリプト言語のようにプログラミングの容易性が求められていた。


# Goの特徴
### 豊富な標準ライブラリ
ファイル操作や書式に関するライブラリの他、最近作られた言語だけにWeb系のライブラリも充実しています。また、GitHubにはサードパーティのライブラリも豊富に用意されているため、簡単にそれらを利用することもできます。

|ライブラリ名       |使いどころ |
|:-----------------|:------------------|
|fmt|書式に関する処理など|
|net/http|HTTPサーバなど|
|encoding|JSON, XML, CSVなど|
|html/template|HTMLテンプレートなど|
|os, path/filepath|ファイル操作など|

パッケージを利用するには、利用するパッケージをインポートし、`fmt.Println`のように"パッケージ名.関数"の形で記述します。

```go

  // fmtライブラリをインポートする
  import "fmt"
  
  func main() {
    // fmtライブラリを利用する
    fmt.Println("Hello world!")
  }
```
[The Go Playground](https://play.golang.org/p/jiBAngWUbiw)


### 周辺ツールの充実
開発ツールは標準ツールの他、準標準ツール、サードパーティ製ツールが充実しています。
特にgomftやgoimportsは必ず使うように心がけましょう。

|ツール名|使い所|
|:-----------------|:------------------|
|go build|ビルドを行うコマンド|
|go test|テストコードの実行|
|go doc|ドキュメント生成|
|gofmt, goimports|コードフォーマッター|
|golint, go vet|コードチェッカー、リンター|
|gopls|LSPの実装|

**テストコード**
xxxx_test.goのように、ファイル名の最後が_test.goのファイルを自動的にテストとしてビルド＆実行してくれるツールです。

**コードフォーマッター**
gofmtにかければフォーマットが統一できるので、複数人で開発するとフォーマットがバラバラになるといった無用なストレスから解放されます。

**コードチェッカー**
静的コードチェックをしてくれるツールです。ビルドが通っても、実行時エラーが出るようなコードをこのツールで潰すことができます。これも事前にチェックすることで無用なエラーに悩まされる心配がなくなります。

```go

  // %dに対して文字列を与えると、ビルドは通るが実行時エラーになる
  fmt.Printf("%d","hello world!")
```
`./main.go:6:2: Printf format %d has arg "hello world!" of wrong type string
Go vet exited.`
[The Go Playground](https://play.golang.org/p/QHbrBP44p-K)


### シングルバイナリとクロスコンパイル
Goは実行ファイルをシングルバイナリで生成するため、サーバやDocker上に実行ファイルを置くだけでサービスを実行することができます。また、クロスコンパイルに対応しているため、作ったサービスを色々な環境(Linux,Windows,Androidなど)に提供できることも特徴です。

# Goを勉強するには
### 書籍を読む
- [みんなのGo言語](https://www.amazon.co.jp/%E6%94%B9%E8%A8%822%E7%89%88-%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEGo%E8%A8%80%E8%AA%9E-%E6%9D%BE%E6%9C%A8-%E9%9B%85%E5%B9%B8/dp/4297107279/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%E3%81%BF%E3%82%93%E3%81%AA%E3%81%AEGo%E8%A8%80%E8%AA%9E&qid=1573976177&s=books&sr=1-1)
- [Goならわかるシステムプログラミング](https://www.amazon.co.jp/Go%E3%81%AA%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E6%B8%8B%E5%B7%9D-%E3%82%88%E3%81%97%E3%81%8D/dp/4908686033/ref=sr_1_1?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=Go%E3%81%AA%E3%82%89%E3%82%8F%E3%81%8B%E3%82%8B&qid=1573976144&s=books&sr=1-1)

### ドキュメントを読む
- [言語仕様](https://golang.org/ref/spec)
- [Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments)（[日本語訳](https://qiita.com/knsh14/items/8b73b31822c109d4c497)）

### コミュニティに参加する
- [Gophers Slack](https://invite.slack.golangbridge.org/)
 - 世界中のGopher（Goのユーザ）が集まる
- [Umeda.go](https://umedago.connpass.com/)
 - 大阪近辺のプログラミング言語 Go ユーザーコミュニティ


# 最後に
今回はGoの特徴を中心にまとめました。次回はコーディングの基本編を書いていこうと思います。