Goの初心者がechoを使って、"Hello World"をブラウザに表示するまで

# 目次
1. goenvをインストール
2. goをインストール
3. go moduleを初期化
4. "Hello World" を表示させるコードを書く
5. echoをインストール
6. hello.goを実行し、ブラウザにアクセス 

#1. goenvをインストール
goのバージョンを管理するツール
rubyでいうところのrbenv

```
$ brew install goenv
```
パスを通す

```
//現在のシェルを確認
$ echo $SHELL 
> /bin/bash

- bashの場合 .bash_profileにパスを設定
- zshの場合 .zshrcにパスを設定

$ cd ~  // ホームディレクトリに移動

$ ls -a //カレントディレクトリのファイル等を表示

// 私の場合、 シェルがbashなので、 .bash_profileがなければ作成する
$ touch .bash_profile
$ touch .zshrc // 現在のシェルがzshで、 .zshrcファイルがなければこちらのコマンド

//ファイルにパスを追加する

$ vim .bash_profile

//以下を最後の行に追加
export PATH="$HOME/.goenv/bin:$PATH"
eval "$(goenv init -)"

//設定の変更を反映させる
$ source ~/.bash_profile
```

#2. Goをインストール

```
//　インストールできるバージョンを確認
$ goenv install -l 

// バージョンを指定してインストール
$ goenv install 1.13.1

// インストールできたか確認
$ goenv versions    // 現在使用可能なバージョンが表示される

// インストールしたgoのバージョンを適応する
$ goenv global 1.13.1   //全てのディレクトリで1.13.1バージョンが使える
$ goenv rehash

$ go version  // 現在設定されているバージョンを確
```

#3. go moduleを初期化する

```
$ go mod init app

// ディレクトリ構造
go
├── go.mod    //新たに作成される
└── main.go
```

```go.mod
//このファイルはgit mod init　コマンドで自動に生成される

module app

go 1.13

require (
	github.com/labstack/echo v3.3.10+incompatible
	github.com/labstack/echo/v4 v4.1.17 // indirect
)
```

#4. "Hello World" を表示させるコードを書く

ディレクトリとファイルを作成

```
$ mkdir go
$ cd go
$ touch main.go
```

ファイルの中身を書く

```main.go
package main

import (
    "net/http"
    "github.com/labstack/echo"
)

func main() {
    e := echo.New()
    e.GET("/", func(c echo.Context) error {
        return c.String(http.StatusOK, "Hello World")
    })
    e.Logger.Fatal(e.Start(":1323"))
}
```

#5. Echoをインストール
```
$ go get github.com/labstack/echo/v4
```
#6. main.goを実行
```
$ go run main.go
go: finding golang.org/x/crypto latest
go: downloading github.com/mattn/go-colorable v0.1.2
go: downloading github.com/mattn/go-isatty v0.0.9
go: downloading github.com/valyala/fasttemplate v1.0.1
...
...
...
   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:1323

// 必要なモジュールがダウンロードされていき、go.sumに依存しているモジュールのファイルツリーのハッシュ値が記録される

//ディレクトリ構造
go
├── go.mod
├── go.sum  // 追加される
├── main  // 追加される
└── main.go

```

go.sumの中身

```go.sum
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
github.com/labstack/echo/v4 v4.1.17 h1:PQIBaRplyRy3OjwILGkPg89JRtH2x5bssi59G2EL3fo=
github.com/labstack/echo/v4 v4.1.17/go.mod h1:Tn2yRQL/UclUalpb5rPdXDevbkJ+lp/2svdyFBg6CHQ=
github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0=
...
...
...
```

[http://localhost:1323/](http://localhost:1323/ "Golang の echo を使う")にアクセスすると"Hello World"と表示される

##もしも、go run main.goで以下のエラーが出てしまったら
すでにポートが使われているプロセスがあるので、そのプロセスを終了させる

```
   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v3.3.10-dev
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
{"time":"2020-09-21T04:05:07.089506+09:00","level":"FATAL","prefix":"echo","file":"hello.go","line":"13","message":"listen tcp :1323: bind: address already in use"}
exit status 1

//　psコマンドで実行中のプロセスを確認
$ ps
  526 ttys000    0:00.29 -bash
 2974 ttys001    0:00.09 /bin/bash -l
 3636 ttys001    0:00.78 go run main.go

//同じポート番号を使っているであろうプロセスを削除
$ kill -9 3636
```


#注意点
[[GO言語] Depはもう古い GoModulesへ移行しよう](https://www.threenext.com/gomodules/ "[GO言語] Depはもう古い GoModulesへ移行しよう")

Goの環境設定を調べていると"GOPATHを設定する"記事を結構目にしますが、GOPATHを設定すると色々とエラーが出たのと、もう古いらしいのでGOPATHは設定していません。

#参考
[Golangをgoenvを使ってインストールしてみた](https://qiita.com/walkers/items/761b2a5e58849176a633 "Golangをgoenvを使ってインストールしてみた")
[【zsh, bash】macでPATHを通す方法 - not found と出てしまったら](https://qiita.com/k3ntar0/items/eb8cdbd8eba9da388def "【zsh, bash】macでPATHを通す方法 - not found と出てしまったら")
[よく使う Vim のコマンドまとめ](https://qiita.com/hide/items/5bfe5b322872c61a6896 "よく使う Vim のコマンドまとめ")
[GolangとEchoでお手軽にAPIサーバを立てる](https://ken-aio.github.io/post/2019/01/30/golang-echo/#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB "GolangとEchoでお手軽にAPIサーバを立てる")
[Go Modules](https://qiita.com/propella/items/e49bccc88f3cc2407745 "Go Modules")
[Address already in use の対処法](https://qiita.com/arashida/items/8b8d9d2f1f040b2aecf1 "Address already in use の対処法")



以上