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が提供している
Golandが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は次のように記述します。
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 とか使いたいときに利用 |