Go is an open source programming language that makes it easy to build simple, reliable, and efficient software.

The Go Programming Language

A Web API is an application programming interface for either a web server or a web browser.

Web API

Go 言語(Golang)と、Gin Web Frameworkを使って Web API を作ってみます。

Go 言語についての説明は他サイトにまかせとりあえず動かしてみます。

Go 言語の準備

asdf

Go 言語のインストール/バージョン管理に asdf を使ってみます。

asdf とは、各言語やツールのバージョン管理等をおこなえる CLI ツールです。

asdf が対応している言語等は、Plugin List より確認できます。

プロジェクト等のディレクトリに .tool-versions ファイルを作成し、各言語やツールのバージョンを指定しておくと、そのバージョンのものが使用できます。 詳細は Set Current Version を参考にしてください。

asdfのインストールより、 Operating System , Installation Method を選んで、手順通りにインストールします。

Go 言語

asdf を使って Go言語 をインストールします。

以降、ターミナルよりコマンドを実行していきます。

# Go用のasdf pluginをインストールする
$ asdf plugin-add golang

# インストール可能なGoのバージョンを見る
$ asdf list all golang

# 今回は1.15.3をインストールしてみる
$ asdf install golang 1.15.3

# 1.15.3をグローバルに設定
$ asdf global golang 1.15.3

# バージョンを表示して確認する
$ go version

上に記載した .tool-versions ファイルを試してみます。

# ディレクトリ毎にバージョンが変わるのか試すために、別バージョンをインストールしておく。
$ asdf install golang 1.14.11

$ mkdir 1.4 1.5

$ echo "golang 1.15.3" > 1.5/.tool-versions
$ echo "golang 1.14.11" > 1.4/.tool-versions

# 1.5 ディレクトリに移動してバージョンを確認
$ cd 1.5 && go version && cd ..
go version go1.15.3 darwin/amd64

# 1.4 ディレクトリに移動してバージョンを確認
$ cd 1.4 && go version && cd ..
go version go1.14.11 darwin/amd64

# 後始末
$ rm -r 1.5 1.4

ディレクトリにより Go 言語のバージョンの違いが確認できます。プロジェクト毎にバージョンを変えたりなどに使えそうです。

Web API を作成

Gin Web Frameworkを使い、Json を返却する Web API を作成します。

プロジェクトの準備

Go 言語プロジェクトの準備をします。

任意のディレクトリで、新しいディレクトリを作成し移動します。

$ mkdir go-api && cd go-api

asdf のバージョン管理ファイルを作成します。 これで、このディレクトリ配下では、ここで指定したバージョンの Go 言語が採用されるようになります。(任意)

$ echo "golang 1.15.3" > .tool-versions

$ go version
go version go1.15.3 darwin/amd64

Go の依存管理 Modules を使えるようにし、Gin Web Framework を追加します。

go-api という名前のモジュールとして作成します。

$ go mod init go-api

# go.modが作成されるので表示してみる
$ cat go.mod
module go-api

go 1.15

# 依存モジュールを確認してみる
# 現段階では、作成しているモジュール名のみ(go-api)表示される
$ go list -m all
go-api

Gin Web Framework を追加します。

$ go get -u github.com/gin-gonic/gin

# 依存モジュールを確認してみる
$ go list -m all

# 関連するモジュールが表示されるようになる

これで開発する準備は完了です。

実装

今回は、Gin Web Framework の Quick start のコードを使ってみます。 main.go ファイルを作成し以下を記載します。

package main

import "github.com/gin-gonic/gin"

func main() {
  r := gin.Default()
  r.GET("/ping", func(c *gin.Context) {
    c.JSON(200, gin.H{
      "message": "pong",
    })
  })
  r.Run()
}

起動

Web API を起動し、動作させます。

以下の場合は、 debug モードでの起動となります。 以下のメッセージにあるように、 GIN_MODE=release を環境変数に指定すると production モードになります。

$ go run main.go

[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env:   export GIN_MODE=release
- using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /ping                     --> main.main.func1 (3 handlers)
[GIN-debug] Environment variable PORT is undefined. Using port :8080 by default
[GIN-debug] Listening and serving HTTP on :8080

CTRL+C 等で Web API を停止します。

production モードで起動してみます。

$ GIN_MODE=release go run main.go

# 起動時のログが何もでなくなります。

Web API にアクセスします。(Web API を起動したターミナルとは別のターミナルから実行します)

$ curl -vs localhost:8080/ping
*   Trying ::1...
* TCP_NODELAY set
* Connected to localhost (::1) port 8080 (#0)
> GET /ping HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.54.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Content-Type: application/json; charset=utf-8
< Date: Thu, 29 Oct 2020 09:07:06 GMT
< Content-Length: 18
<
* Connection #0 to host localhost left intact
{"message":"pong"}

Web API を起動したターミナルには以下のようにログが表示されます。

[GIN] 2020/11/01 - 10:00:00 | 200 |      56.152µs |             ::1 | GET      "/ping"

まとめ

Web API の準備、実装から起動までの流れを追ってみました。

Go 言語の学習には A Tour of Go がまずはおすすめです。 有志の方による日本語訳が こちら にあります。

最後に Web API 起動までに最低限必要なコマンドをまとめました。(Go 言語のインストールは省く)

# プロジェクトの準備
$ mkdir go-api && cd go-api
$ go mod init go-api
$ go get -u github.com/gin-gonic/gin

# 実装する

# 起動する
$ go run main.go

ソースはこちらに置いてあります。

機会をみていくつか機能を実装していく予定です。

最後まで読んで頂きありがとうございます。