LoginSignup
126
124

More than 3 years have passed since last update.

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

Last updated at Posted at 2017-07-22

Go初心者です。
昔Tour of Goを一通り触って、
あれ?Goでサーバってどうやってたてるんだっけ?
というところがわかってなかったのでその辺やってみようと思います。

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

  • 言語の仕様が最小限
  • コンパイル型言語(文法エラーチェックができる)
  • 並列処理

このため、最近の特にレイテンシを求められるようなビジネスロジックやプッシュサーバ等、
バックエンドサーバ用として主流の言語です。

NodeJSはイベントループの壁があるからGoのほうが
スケールするという記事をみかけたのも勉強しようと思ったきっかけです。
(NodeJSも、JSの知識使いまわせたり、npmのエコシステム大好きですけど)
Gopherの道を歩む – Node.jsからGo言語への移行

Goの導入

fiveyears.jpg
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フォルダを開きます。
スクリーンショット 2017-07-22 20.28.02.png

design.goファイルを作成します。
スクリーンショット 2017-07-22 20.28.18.png
スクリーンショット 2017-07-22 20.34.44.png

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します。
スクリーンショット 2017-07-22 20.47.08.png

http://localhost:8080/todolist/(:todoID)にアクセスします。
スクリーンショット 2017-07-22 20.58.27.png

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 とか使いたいときに利用
126
124
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
126
124