Edited at

Go初心者がさっくりAPIサーバを立てる

Go初心者です。

昔Tour of Goを一通り触って、

あれ?Goでサーバってどうやってたてるんだっけ?

というところがわかってなかったのでその辺やってみようと思います。

Go言語の良さは次の点があげられると思います。


  • 言語の仕様が最小限

  • コンパイル型言語(文法エラーチェックができる)

  • 並列処理

このため、最近の特にレイテンシを求められるようなビジネスロジックやプッシュサーバ等、

バックエンドサーバ用として主流の言語です。

NodeJSはイベントループの壁があるからGoのほうが

スケールするという記事をみかけたのも勉強しようと思ったきっかけです。

(NodeJSも、JSの知識使いまわせたり、npmのエコシステム大好きですけど)

Gopherの道を歩む – Node.jsからGo言語への移行


Goの導入



Go言語マスコットキャラのGopher君です

インストールガイドどおり

/usr/local/goに展開して、環境変数のパスを通します。

Goのインストール

$GOPATHも設定します

下記参考によるとどこでも良いらしいですが、一度決めたら変更は難しいようです。

GOPATH は適当に決めて問題ない

ちなみに私は~./bash_profileに次のように設定してます(Mac環境)

export GOROOT=/usr/local/go

export GOPATH=$HOME/go
export PATH=$GOROOT/bin:$GOPATH/bin:$PATH

goではgo getと呼ばれるコマンドでgitのソースコードをダウンロードすることができます。

以下のフォルダに配置されます。

$GOROOT/src

詳細は下記を参考にしてください

go getコマンド


開発環境

スクリプト言語なのでIDEとか使わなくても開発できますがIDEのほうが

コード補完してくれたりデバッグのブレークポイントかけられたりで楽なので導入したほうが良いでしょう。

Android Studio IDEとかを作っているJetBrainsが提供している

GoglandがIDEとしてイケてます。

まだEarly Build版ですが・・・

基本的な使い方は下記を参考にしてください

参考:Gogland - Go 言語用 IDE - を使ってみた (2016年12月版)


Goの文法

Goの文法は次のチュートリアルを一通りやればマスターできます。

Tour of Go

Go2がそろそろ来そうですが・・・


Goのライブラリ

標準ライブラリパッケージ

Standard library

よく使いそうな系のライブラリはここ見れば大抵あるようです。

Awesome Go

知っておくと良さそうなライブラリ

楽ができるGolangのライブラリ達


アプリケーションサーバを立てる

Goaというフレームワークが良いらしいです。

APIのビジネスロジックに集中できるのとSwaggerというAPI仕様ファイルを生成してくれます。

SwaggerはAPI仕様とともにモックサーバ作れたり、ブラウザ上でAPIテストできたりとかなり便利なので知っておいて損はないです。(YAMLやjson形式なのでgitで変更管理もできるし)

参考:SwaggerでAPIを定義してインタラクティブAPIドキュメントを見る

Goaのインストールは次リンクが参考になります。

参考:goa のインストールと実行

Goaの作り方まとめてるページがあるので参考にさせてもらって進めます。

GolangのgoaでAPIをデザインしよう(基本編)


ORM(DB操作)

goaではgormaと呼ばれるORMでDB操作します。

GolangのgoaでAPIをデザインしよう(Model編)

裏側ではgormというORMが使われているらしいです。

gormの使い方はここが詳しいです。

【GORM】Go言語でORM触ってみた


サンプルのAPIサーバを立てる

TODOリストサーバを立ててみます。

$GOPATH/srcフォルダ以下にtodolistフォルダを作ります。

goaではdesignフォルダ以下にAPI実装を書くため、designフォルダもついでに作ります。

mkdir -p $GOPATH/src/todolist/design

cd $GOPATH/src/todolist

goglandで$GOPATH/src/todolistフォルダを開きます。

design.goファイルを作成します。



design.goは次のように記述します。


design.go

package design                                    

// package "design"
import (
. "github.com/goadesign/goa/design"
. "github.com/goadesign/goa/design/apidsl"
)

var _ = API("todolist", func() {
Title("The virtual todolist")
Description("A simple goa service")
Scheme("http")
Host("localhost:8080")
})

var _ = Resource("todolist", func() {
BasePath("/todolist")
DefaultMedia(TodoListMedia)

Action("show", func() {
Description("Get todo by id")
Routing(GET("/:todoID"))
Params(func() {
Param("todoID", Integer, "Todo ID")
})
Response(OK)
Response(NotFound)
})
})

// TodoListMedia defines the media type used to render todolist.
var TodoListMedia = MediaType("application/vnd.goa.example.todolist+json", func() {
Description("A todo of todolist")
Attributes(func() {
Attribute("id", Integer, "Unique todo ID")
Attribute("href", String, "API href for making requests on the todo")
Attribute("name", String, "Name of todo")
Required("id", "href", "name")
})
View("default", func() {
Attribute("id")
Attribute("href")
Attribute("name")
})
})


goagenコマンドのbootstrapオプションでテンプレート生成します。

$goagen bootstrap -d todolist/design

プロジェクトのtodolistフォルダを右クリックしてRunします。

http://localhost:8080/todolist/(:todoID)にアクセスします。


DSL

DSL(domain-specific language、DSL)とは特定のタスク特定のタスク向けに設計されたコンピュータ言語を指します。

goaではAPI定義、エンティティ(ORMモデル)定義、Swaggerドキュメント定義等をgoa専用DSLで定義することができます。

記述したdesign.goがそれに該当します。


goagen

上記のDSLを解釈してコードを自動生成してくれるツールです。

開発者はDSLだけを書けば、後はgoagenで自動生成できます。

サブコマンド
説明

bootstrap
初回に実施するコマンド (main/app/client/swaggerを実行する)

main
APIサーバの main とコントローラーを作業ディレクトリに生成.このコマンドで生成されるファイルは上書きされない (--forceオプションで上書きを強制可能)

app
アプリケーションのテンプレートを app ディレクトリ以下に生成

client
APIサーバに対応するクライアントのコードを client / tool ディレクトリ以下に生成

swagger
APIサーバの使用を swagger 形式で swagger ディレクトリ以下に出力

js
JavaScript のAPIサーバクライアントを js ディレクトリ以下に生成

schema
API の JSON スキーマを schema ディレクトリに生成

gen
サードパーティの generator を利用するときに指定する.gorma とか使いたいときに利用