【Go】環境構築と勉強方法

# はじめまして
昨年、未経験からエンジニア転職をしました。
転職にあたり、約2ヶ月、プログラミングスクールでHTMLやらCSSやらを学び、Ruby on Railsでアプリ開発をしましたが、即戦力！というわけにはいかず、勉強しながら、教えてもらいながら、なんとか業務を進めていました。

入社から4ヶ月くらい経ったある日、メンターの先輩から、
「プログラミングの基礎を勉強した方がいい。というか、絶対にして。」と言われ、
「配列とかは勉強しましたよ！」と返したら、
「じゃあ、Linked ListとかBinary Treeはわかる？」と聞かれ、
「...ナンデスカソレ:skull:」となったので、基礎の勉強をスタートさせました。

これから数ヶ月にわたり、プログラミングの基礎である、データ構造とアルゴリズム(Data structures & Algorithms)をシリーズ化して投稿したいと思います。
題して、**Goでプログラミングの基礎を学ぶ**です。(特にひねりはないです)
私自身のoutputを主目的にしていますが、プログラミングスクールでそういった基礎を勉強せずに転職した方々の参考になれば幸いです。

# Goでプログラミングの基礎を学ぶシリーズ
スクールでは教えてくれないプログラミングの基礎、**データ構造とアルゴリズム**をGoで学んでいくシリーズです。
そのデータ構造がどのようなものであるかは、理解を助けてくれるサイトを紹介しつつ、簡単に説明に留めさせていただきます。(ご自身でも調べてみてください！)
筆者自身、Exerciseに取り組みながら理解を深めていったので、コードの解説を中心に記事を書いていきたいと思います。

|  | タイトル |
|------|---------|
| #0 | はじめに (環境構築と勉強方法) **☜ here** |
| #1 | [Pointer, Array, String (ポインタと配列と文字列と)](https://qiita.com/miyyuk/items/75fad6c02b76354fa49d) |
| #2 | [File operations (ファイル操作)](https://qiita.com/miyyuk/items/641faf682e09709727af) |
| #3 | [Linked List (連結リスト)](https://qiita.com/miyyuk/items/af9d3352f89f11365dc4) |
| #4 | [Stack & Queue (スタックとキュー)](https://qiita.com/miyyuk/items/a188def21c31367330f3) |
| #5 | [Search algorithms (探索アルゴリズム)](https://qiita.com/miyyuk/items/91920dee5151e9c4c43e) |
| #6 | [Tree (木構造)](https://qiita.com/miyyuk/items/a11c22a62bb95c1996ba) |
| #7 | [Sorting algorithms (ソートアルゴリズム)](https://qiita.com/miyyuk/items/85c2ed8176e9bdf7e677)|
| #8 | [String pattern matching algorithms (文字列探索アルゴリズム)](https://qiita.com/miyyuk/items/bce37f7f8c24b48cfd3f) |

今記事は、**#0 はじめに** と題して、Go環境構築と、Goを勉強する入り口になるツールの紹介をします。
Goでコードを書くための準備回です。

# 対象読者

- Goに触れるのは初めてだが、他の言語でループとか配列は学習したことがある人
- フレームワークを使わずにコードを書ける自信がない人
- データ構造とアルゴリズム の勉強をしたことがない人

# Golang 開発環境構築

まずは環境構築をしましょう。
こちらの記事がわかりやすかったので、参考にしてみてください[^*]。
他にも検索すればたくさんヒットするので、当記事では割愛します。

[^*]: PATHってなんだとなった方はこちら▶︎[PATHを通すとは？ (Mac OS X)](https://qiita.com/soarflat/items/09be6ab9cd91d366bf71)

- [2020年版 Go言語 環境構築【macOS編】](https://zenn.dev/em0/articles/9bc0cdd2addcac6ec5fb)
- [2020年版 Go言語 環境構築【Windows編】](https://zenn.dev/em0/articles/41bbfb9aae6bb9240fa9)

私が初めてGoでコードを書こうとしたときに、よくわからなかったことがあります。
>ファイルってどこに配置したらいいの？

です。
結論、`~/go/src`直下に配置していくのですが、これがRailsなどとは異なり、最初は混乱しました。

Railsだと以下のような感じになるかと思います。

```
└── $HOME
    └──project1
    └──project2
    └──project3
       └──app
       └──db
       └──public
```

Railsではどこのフォルダにプロジェクトを配置しても特に問題ありませんでしたが、GoではPATHを通す必要があるため、こうなります。

```
└── $HOME
    └──go
       ├── bin
       ├── pkg
       └── src
           └──project1
           └──project2
           └──project3
              └──main.go
```

`hello world`の実行は、上記参考サイトの``テストコードの実行``をご参考ください。
たったこれだけのことではあるのですが、私以外にもわからない人いるのではと思い、補足してみました。

<font color="Red">2021/2/26追記：</font>
@nobonobo さんからコメントにてご指摘いただきまして、
> ~/goはGOPATHという環境変数が設定されていない場合のデフォルトのパスです。
この配下にソースコードを置かなければならないのは古い制約で、Go1.11以降はGo-Moduleモードというものがあります。
参考に： https://zenn.dev/nobonobo/articles/4fb018a24f9ee9

ということで、上述は古い制約です。大変申し訳ありません:bow_tone1:
こちらのサイト▶︎https://qiita.com/propella/items/e49bccc88f3cc2407745 も参考にして、`go/src/`ではないところでディレクトリを作成し、ファイルを実行したところ、実行できました:bow_tone1:
@nobonobo さん、参考記事を含め、ご教示いただきありがとうございます！

# Goを勉強できるツール

以下いずれも環境構築をせずにweb上でコードを書くことができます。
※とはいえ、いずれ絶対必要になるので環境構築はしておきましょう！

### 1. [A Tour of Go](https://go-tour-jp.appspot.com/list)
![スクリーンショット 2021-02-24 0.49.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653268/39f15eff-8b39-e950-5c9d-837ae947e333.png)
なんといっても公式が一番です。
Welcome!から順番に進めていけば、基本的なコードは書けるようになります。
日本語で読み進めることができ、Exerciseで理解を深めることができます。

ただ、初学者がこのExerciseを解くのはかなり難しいです。
先輩エンジニアの解答を見ながら、少しずつ理解していくのでも良いかもしれません。
▶︎途中までですがソースはこちら: https://github.com/miyyuk/a-tour-of-go
▶︎先輩エンジニアの記事: [A Tour of Goをやり終えた](https://qiita.com/dondoko-susumu/items/4b298ce083e03f351f40)

### 2. [progate](https://prog-8.com/languages/go)
![スクリーンショット 2021-02-24 0.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653268/1f29935e-f26c-e9d4-6a59-761d77d371d2.png)
言わずと知れたプログラミング学習サービスです。
Go以外にもPHPやPythonなど様々な言語を学習することができます。
Goでは、課金すれば、鬼門とされるポインタまでをキャラクターがわかりやすく解説してくれます。
個人的には課金する価値は十分にあると思います。

### 3. [paiza](https://paiza.jp/challenges)
![スクリーンショット 2021-02-24 2.30.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653268/e6ffdaa6-022b-7d44-0cc0-47e33f8cc1c9.png)
Goだけでなく自分の好きな言語でコードが書けます。
まずはD,Cランクの問題に取り組んでみるのが良いと思います。
ただ、制限時間があったり、ネットに問題や解答を掲載することは禁止されているので、解けないとずっと解けないままになってしまいます。

### 4. [LeetCode](https://leetcode.com/)
![スクリーンショット 2021-02-24 2.37.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/653268/8ce1e5fe-60d3-1e3e-1648-37fc335bb711.png)
いま会社で流行っているサービスです。
こちらもGoだけでなく言語を選べます。
paizaとの違いは、制限時間がなく、解答を見ることもできます。(解答を見るのに課金が必要な問題もあります。)
検索すれば解答がたくさん出てきますし、Discussで他の人のコードを見られます。
さらに、一度Acceptedされると、実行速度の分布を表示してくれ、自分より実行速度が速い人のコードを見ることができます。(これがとても勉強になります。)

また、データ構造やアルゴリズムの解説ページもあり、至れり尽くせりです。
ただし、全て英語です。

### おすすめ
まずはprogateで1ヶ月だけ課金してGoの学習コースをやり切り、A Tour of Goを取り組む流れが良いと思います。
progateの方が初学者には優しいです。
A Tour of Goも、Basicsまでなら、progateの内容がわかれば進められると思います。
(私はその後のinterfacesで一度挫折しました。)
わかるようになってきたと思ったら、paizaやLeetCodeでひたすら書いてみるのが良いと思います。

# おわりに

Goでプログラミングの基礎を学ぶ **#0 はじめに (環境構築と勉強方法)** ということで、Goでコードを書いていく準備をしました。
次回は、データ構造とアルゴリズムを学ぶ下準備として、Array,Pointerを学ぶための記事を書きたいと思います。

株式会社Link Sportsでは、あらゆるスポーツを楽しむ人たちに送る、チームマネジメントアプリを開発しています。
未経験でも経験豊富なエンジニアの方でも、スポーツ好きなら活躍できる環境があります！
絶賛エンジニア募集中です！
Wantedly ▶︎ https://www.wantedly.com/projects/324177
Green ▶︎ https://www.green-japan.com/job/82003

最後までお読みいただきありがとうございました。