僕も流行りにのってGoでAPIサーバーを書きたい 〜 導入編 〜


現在、新しくプロダクトを作っています。さて、サーバーサイドの開発言語を選定する過程で、いつもなら慣れているPythonを迷わず選ぶのですが、「最近Goって流行ってるよなあ、キラキラしてていいなあ、俺もキラキラしたい!」と思うようになりました。

茶番はこれくらいにして、今回はGoで作るAPIサーバーの開発について、セットアップから運用まで備忘録も兼ねて何回かに分けて述べようと思います。

Go言語のインストール

Go言語を使うには、まずGoのコンパイラをインストールしなければなりません。
macOSの場合はHomebrewで直接インストールすることができます

$ brew update && brew install go

パッケージマネージャー dep

まず、APIサーバーを開発するのに必要なフレームワークやライブラリを一式揃えます。
ここでは、depというパッケージマネージャーを用いて導入を行います。Go言語には他にも便利で強力なパッケージマネージャーがいつくか存在しますが、

  • Goの公式チームが開発していること
  • Go標準のパッケージマネージャになることを目指していること
  • 競合のGlideもdepへの移行を推奨していること

上記のような理由でdepを採用します。

macOSを利用している場合, Homebrewを用いて比較的簡単に導入することができます。

$ brew update
$ brew install dep

Linuxの場合はgo getを利用して導入してください。

$ go get -u github.com/golang/dep/cmd/dep

dep versionを実行して以下のような出力がされたらインストールに成功しています。

dep:
 version     : v0.5.1
 build date  : 2019-03-11
 git hash    : faa6189
 go version  : go1.12
 go compiler : gc
 platform    : darwin/amd64
 features    : ImportDuringSolve=false

プロジェクトの作成

次に、以下のようなディレクトリ構成で新しいGoプロジェクトを作成します。$GOPATH/src配下に自分のプロジェクトベースのディレクトリを作成します。ここでは、ソースをGithubに置く場合を示していますが、BitbucketやオンプレミスのGitLabに置く場合はgithub.comself_hosting_git.comなどに変更するだけで対応することができます。

$ mkdir $GOPATH/src/github.com/user_name/your_repo
$ cd $GOPATH/src/github.com/user_name/your_repo
$ dep init

dep initを実行するとGopkg.tomlが作成されます。

ライブラリの導入

depはソースに書いてあるimport文を自動的に認識してライブラリの導入を行うことができますが、ここではソースを書き始める前に事前に行おうと思います。depでのライブラリ追加コマンドはdep ensure -add github.com/org/repoです。まずは、今回APIサーバーを構築するに当たって重要となるマイクロフレームワークechoの導入を行います。

$ dep ensure -add github.com/labstack/echo

Echo Serverの作成

プロジェクトルートに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"))
}

では実際に動作させて確認してみましょう。go run main.goでコンパイルが成功するとサーバーが立ち上がるはずです。http://localhost:1323にアクセスしてHello, World!と表示されるか確認しましょう。

無事, Hello, World!と表示されました。成功です。

次回は、Goの基本の書き方を踏まえながらRoutingについて投稿したいと思います。