この記事はユアマイスター Advent Calendar 2021 10日目の記事です。
こんにちは!
Webエンジニアをしています。
南です。
最近Goの勉強をしていて、まずはじめに行ったのがGoの環境構築でした。
ローカルのマシンの環境を汚したくないというのと、他のPCでも同じ用に環境構築ができたらいいなという理由でDokcerを使って環境構築を行うことにしました。
今回は僕がGoの勉強を行う際に、行った環境構築について紹介します。
ちなみに使用するGoのバージョンは、勉強の際に最新だった1.16で環境構築を行っていきます。
また、Dockerのバージョンは3.3.1を使用しています。
ディレクトリ構成
Photo by Maksym Kaharlytskyi on Unsplash
今回行った環境構築では、次のような構成にしました。
元々Go側でAPI、フロント側でVueJsを使ったアプリを作ろうと思っていて、このような構成にしました。
Dockerについてはdockerディレクトリにまとめて、APIについてはsrc/apiにまとめておいた方が、管理もしやすいと思ったからです。
Goの環境構築
Photo by Josh Hild on Unsplash
では、ここから実際にGoの環境構築を行っていきます。
今回行った環境構築は以下のリポジトリから、クローン可能ですので、良かったら試してみてください。
※今回はあくまで勉強用に作った物になるため、プロダクション環境において適切かどうかは、各自お調べ頂ければと思います。
.envファイルの作成
まずはdokcer-compose.ymlなどで使っていく環境変数を、.envファイルにまとめていきます。
以下のような構成で作ってください。
docker-compose.ymlの作成
.envが作成できたら、次はdocker-compose.ymlを作っていきます。
Go用のDokcerfileの作成
docker-compose.ymlが作成できたら、次はGo用のDockerfileを作っていきます。
dockerディレクトリ内に、apiというディレクトリを作ってください。
apiというディレクトリにする理由は、docker-compose.yml内で、contextの箇所に./apiと指定しているからです。
apiというディレクトリができたら、Dockerfileを作成します。
Dockerfileの中身は、以下のように設定します。
Goファイルの作成
Photo by Kelly Sikkema on Unsplash
Go用のDockerfileが作成できたら、最後にGoのファイルを作成します。
go-dockerディレクトリ内に、src/apiという階層でディレクトリを作成します。
apiのディレクトリ内で、main.goというファイルを作成します。
中身は、一旦以下のようにしましょう。
Dockerの立ち上げ
Photo by Andy Hermawan on Unsplash
ここまでできたら、最後に以下のコマンドをdocker-compose.ymlがあるディレクトリで、叩いてみてください。
dockerが立ち上がります。
dockerが立ち上がったら、以下のコマンドでdokcerのコンテナの中に入りましょう。
中に入ってlsコマンドを打つと以下のようになっていると思います。
上記のように表示されたら、同じ場所で以下のコマンドを打ってGoのビルドを行って立ち上げます。
コマンドをうった後に、以下のURLにアクセスします。
すると、以下のように表示されるはずです。
URL:http://localhost:8000/
画面に表示されるもの: indexページ
これでGoの環境構築は完了です。
Goファイルの中身紹介
Photo by Vladislav Klapin on Unsplash
最後に今回処理を書いている、Goファイルの中身について少し紹介します。
以下のGoファイルで行っていることは、次のようなことをしています。
1.HTTPリクエストに対するレスポンスを実装。
2.URLのパターンにマッチした際の関数をDefaultServeMuxに登録。
3.ListenAndServeを使って、HTTPサーバーを起動。
HTTPリクエストに対するレスポンスを実装について
HTTPリクエストに対するレスポンスを実装については、以下の箇所で行っています。
ioはGoが提供している入出力用のパッケージで、その中のWriteStringというメソッドを使って文字を出力しています。
URLのパターンにマッチした際の関数をDefaultServeMuxに登録について
URLのパターンにマッチした際の関数をDefaultServeMuxに登録している処理は以下の箇所で行っています。
DefaultServeMuxは、net/httpパッケージで使用されているグローバル変数のことで、次で紹介するListenAndServeの第2引数をnilとした場合に使用されます。
以下のHandleFuncメソッドで、各パターンをDefaultServeMux内に登録します。
ListenAndServeを使って、HTTPサーバーを起動について
ListenAndServeを使うことで、httpパッケージのServeメソッドを呼び出します。
このメソッドの中で受け取ったHTTPリクエストに対して対応するハンドラーを返すといったことをして、レスポンスを返却しています。
ListenAndServeについては以下。
Serveメソッドについては以下に詳しく記載されています。
まとめ
今回は僕がGoを勉強する際に行った環境構築について紹介しました。
この記事が同じようにGoの勉強を始めるために、環境構築について悩む人のために慣れば幸いです。
今回環境構築に使ったソースは以下から使用できますので、良かったら参考にされてみてください!