{
    "componentChunkName": "component---src-templates-blog-post-jsx",
    "path": "/post/introduction-of-golang/",
    "result": {"data":{"site":{"siteMetadata":{"title":"WEB EGG","author":"Leko - CTO at Yuimedi"}},"markdownRemark":{"id":"7332ee70-daec-578f-8d12-fc36b347f092","excerpt":"お久しぶりです。Go の門を叩いてみました Go はマスコットの謎生物が可愛いですね。Gopher…","html":"<p>お久しぶりです。Go の門を叩いてみました</p>\n<p>Go はマスコットの謎生物が可愛いですね。Gopher というらしいです。<br>\nどこかで見たことあると思ったら、くまのプ ● さんにゴーファーというそのままなキャラクターがいましたね。</p>\n<p>他の言語とはソースコードの構成やら書き方やら結構違っていて馴染めなかったのですが、なんとかことはじめの記事くらいは書ける程度にはなれたので、備忘録として残します。</p>\n<p>Go の環境構築から、Gin という軽量フレームワークで Redis と PostgreSQL を使ったデモアプリを作って、Heroku にデプロイするところまでの備忘録です。<br>\n少しでも Go に入門する人の助けになれば幸いです。</p>\n<!--more-->\n<h2 id=\"なぜ-go-なのか\" style=\"position:relative;\"><a href=\"#%E3%81%AA%E3%81%9C-go-%E3%81%AA%E3%81%AE%E3%81%8B\" aria-label=\"なぜ go なのか permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>なぜ Go なのか</h2>\n<p><del>なんとなく</del>と言ってしまえばそれまでなのですが、 <strong>最近あまり新しいことに挑戦してないなー</strong> と思ったのがきっかけです。<br>\nというのと、今まで触れたことない言語に触れてみたい欲が湧いたので、Go を選んでみました。</p>\n<p>Go について調べているうちに、並列・スケールしやすいとか動作が速いとか良さそうなキーワードが手に入ったり、 <strong>ライブラリ管理つらい</strong> とか嫌ーな情報を入手しつつ、な入門です。</p>\n<p><strong>まだ Go のコードや構成の良し悪しの判断がつかないひよっ子ですので、誤った解釈・もっと良い方法などがございましたらご教授いただけると幸いです。</strong></p>\n<h2 id=\"参考資料\" style=\"position:relative;\"><a href=\"#%E5%8F%82%E8%80%83%E8%B3%87%E6%96%99\" aria-label=\"参考資料 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>参考資料</h2>\n<p>この記事を書くに当たりこれらの情報を参考にさせていただきました。ありがとうございます。</p>\n<blockquote>\n<p><a href=\"http://go-tour-jp.appspot.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">A Tour of Go</a></p>\n</blockquote>\n<!---->\n<blockquote>\n<p><a href=\"http://takasing104.hateblo.jp/entry/2015/05/14/150000\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Golang 周辺のツールをいろいろ使いながら Gin Web Framework で API を作る</a></p>\n</blockquote>\n<!---->\n<blockquote>\n<p><a href=\"https://github.com/takasing/golang-gin-api\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">takasing/golang-gin-api</a></p>\n</blockquote>\n<!---->\n<blockquote>\n<p><a href=\"http://t32k.me/mol/log/go-on-heroku/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Go アプリを Heroku にデプロイする</a></p>\n</blockquote>\n<!---->\n<blockquote>\n<p><a href=\"https://github.com/l-lin/l-lin.github.io/blob/master/_posts/2015-01-31-Golang-Deploy_to_heroku.md\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Deploying a Golang web apps to Heroku</a></p>\n</blockquote>\n<!---->\n<blockquote>\n<p><a href=\"http://qiita.com/Oakbow/items/98599da0fc62863fc1b8\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">heroku でセッションの保存先を Redis にする</a></p>\n</blockquote>\n<!---->\n<blockquote>\n<p><a href=\"http://qiita.com/HirofumiYashima/items/552c1f39b439d6acafd7\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Ubuntu 環境に、Redis をインストールして、使ってみる</a></p>\n</blockquote>\n<!---->\n<blockquote>\n<p><a href=\"http://blog.monochromegane.com/blog/2014/03/23/struct-implementaion-patterns-in-golang/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Go 言語での構造体実装パターン</a></p>\n</blockquote>\n<!---->\n<blockquote>\n<p><a href=\"http://qiita.com/Jxck_/items/547f1c16669f91cc9c29\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">便利メソッド(util)系を Static Method としてまとめる</a></p>\n</blockquote>\n<h2 id=\"デモ今回の構成\" style=\"position:relative;\"><a href=\"#%E3%83%87%E3%83%A2%E4%BB%8A%E5%9B%9E%E3%81%AE%E6%A7%8B%E6%88%90\" aria-label=\"デモ今回の構成 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>デモ、今回の構成</h2>\n<p>まず Go でハマったのが、 <strong>ファイル構成よくわからん。</strong></p>\n<p><strong>パスを縛るな、好きなディレクトリで開発させろや(#ﾟ Д ﾟ)ｺﾞﾙｧ!!</strong><br>\n…すみません好き勝手な構成にした愚鈍めをお許し下さい…プロジェクト作り直しますので…</p>\n<p>という感じでした。<br>\n<strong>自プロジェクト内にある別ファイルをどうインポートするのか</strong> がわからず全部 1 ファイルに書いてしまおうかという悪夢を見ました。<br>\nこの辺は参考記事さまのデモアプリ(<a href=\"https://github.com/takasing/golang-gin-api\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">takasing/golang-gin-api</a>)のコードを見て理解しました。</p>\n<p>ということで今回の構成です。</p>\n<ul>\n<li>Go(1.4.1)</li>\n<li>Vagrant</li>\n<li>Ansible</li>\n<li>(軽量)フレームワーク: <a href=\"https://github.com/gin-gonic/gin\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gin-gonic/gin</a></li>\n<li>O/R マッパ兼マイグレーション: <a href=\"https://github.com/jinzhu/gorm\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">jinzhu/gorm</a></li>\n<li>環境変数: <a href=\"https://github.com/joho/godotenv\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">joho/godotenv</a></li>\n<li>CSRF 対策: <a href=\"https://github.com/gin-gonic/nosurf\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">gin-gonic/nosurf</a></li>\n<li>パスワードハッシュ: <a href=\"https://godoc.org/golang.org/x/crypto/bcrypt\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">crypto/bcrypt</a></li>\n<li>セッション管理: <a href=\"https://github.com/boj/redistore\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">boj/redistore</a> + <a href=\"https://github.com/soveran/redisurl\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">soveran/redisurl</a></li>\n<li>ライブリロード: <a href=\"https://github.com/codegangsta/gin\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">codegangsta/gin</a></li>\n</ul>\n<p>Mac ローカルに色々インストールするのは嫌なので、Vagrant+Ansible で VM 環境を作って、その内に Go やその他もろもろを追加します。<br>\n自前で作った部分はごく僅かです。各ツール・ライブラリを公開してくださっている皆様に感謝です。</p>\n<p>欲張りすぎず簡単すぎない程度に、DB アクセス、認証、セッション管理、CSRF 対策あたりをやってみようと思います。<br>\nセッション管理には Redis を使ってみます。複数台構成にするときに面倒にならないよう早めにセッション共有を突っ込んでおく狙いです。<br>\nライブリロードに使用している gin とフレームワークの gin は別物なので要注意です。</p>\n<p>今回の記事で作るものはこちらのリポジトリにて公開しています。記事と合わせてご覧ください。<br>\n（無料プランなので接続に時間がかかる場合があります。<br>\n<strong>Go が遅いわけではなく Heroku が原因です。</strong> ご留意ください）。</p>\n<p>リポジトリ： <a href=\"https://github.com/Leko/godemo\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Leko/godemo</a><br>\n動作デモ(Heroku)： <a href=\"https://go-demo.herokuapp.com/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">go-demo</a></p>\n<p>※ここから先の内容はデモリポジトリを使う前提で進めます。何をしているかの詳細は各ファイルを御覧ください。</p>\n<h2 id=\"環境を整える\" style=\"position:relative;\"><a href=\"#%E7%92%B0%E5%A2%83%E3%82%92%E6%95%B4%E3%81%88%E3%82%8B\" aria-label=\"環境を整える permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>環境を整える</h2>\n<p>Vagrantfile と provisioning フォルダが入っているので、さくっと環境構築を済ませます。</p>\n<p><span class=\"removed_link\" title=\"http://qiita.com/itayan/items/b41f8541892e693aeb0a\">Vagrant+Ansible で Go 環境を構築し、せっかくなので AWS SDK for Go を試してみる。</span>さまの記事をベースにしつつ、Vagrant の設定、構成・プロビジョニング周りを色々自分好みに改造してます。<br>\nAnsible のインストール等は上記の記事をご覧ください。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ vagrant -v\nVagrant 1.7.2\n\n$ ansible --version\nansible 1.9.2\n\n$ git --version\ngit version 2.4.5\n\n$ git clone git@github.com:Leko/godemo.git\n$ cd godemo\n$ bower install\n$ vagrant up --provision</code></pre></div>\n<p>Ansible のプロビジョニングが走り、エラーが出なければおそらく OK です。<br>\nVM 内にログインして Go のアプリを起動してみます。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ vagrant ssh\n$ vagrant@precise64:~$ cd go/src/godemo\n$ vagrant@precise64:~/go/src/godemo$ go get\n$ vagrant@precise64:~/go/src/godemo$ go get github.com/codegangsta/gin\n$ vagrant@precise64:~/go/src/godemo$ gin -p 8080</code></pre></div>\n<p><span\n      class=\"gatsby-resp-image-wrapper\"\n      style=\"position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 668px; \"\n    >\n      <a\n    class=\"gatsby-resp-image-link\"\n    href=\"/static/2b8efb5a2fdb99c2656c8923f145cb1a/715a3/ping.png\"\n    style=\"display: block\"\n    target=\"_blank\"\n    rel=\"noopener\"\n  >\n    <span\n    class=\"gatsby-resp-image-background-image\"\n    style=\"padding-bottom: 23.353293413173652%; position: relative; bottom: 0; left: 0; background-image: url('data:image/svg+xml,%3csvg%20xmlns=\\'http://www.w3.org/2000/svg\\'%20width=\\'400\\'%20height=\\'93\\'%20viewBox=\\'0%200%20400%2093\\'%20preserveAspectRatio=\\'none\\'%3e%3cpath%20d=\\'M142%2019l1%205%201-3c0-2%201-3%202-3l1%203c0%203%200%203%201%202h2c1%202%205%201%206-1h1c1%202%206%203%206%201v-5c-1-2-3-2-5-1v4l-2-2c-1-4-7-3-7%201%200%202%200%202-1%200%200-2-1-3-2-3l-2-2-1-1-1%205M69%2045v7h15V37H69v8m149%200v7h16V37h-16v8\\'%20fill=\\'%23d3d3d3\\'%20fill-rule=\\'evenodd\\'/%3e%3c/svg%3e'); background-size: cover; display: block;\"\n  ></span>\n  <picture>\n          <source\n              srcset=\"/static/2b8efb5a2fdb99c2656c8923f145cb1a/5251b/ping.webp 167w,\n/static/2b8efb5a2fdb99c2656c8923f145cb1a/7390e/ping.webp 334w,\n/static/2b8efb5a2fdb99c2656c8923f145cb1a/7c056/ping.webp 668w,\n/static/2b8efb5a2fdb99c2656c8923f145cb1a/b2a51/ping.webp 830w\"\n              sizes=\"(max-width: 668px) 100vw, 668px\"\n              type=\"image/webp\"\n            />\n          <source\n            srcset=\"/static/2b8efb5a2fdb99c2656c8923f145cb1a/21521/ping.png 167w,\n/static/2b8efb5a2fdb99c2656c8923f145cb1a/86d36/ping.png 334w,\n/static/2b8efb5a2fdb99c2656c8923f145cb1a/74866/ping.png 668w,\n/static/2b8efb5a2fdb99c2656c8923f145cb1a/715a3/ping.png 830w\"\n            sizes=\"(max-width: 668px) 100vw, 668px\"\n            type=\"image/png\"\n          />\n          <img\n            class=\"gatsby-resp-image-image\"\n            src=\"/static/2b8efb5a2fdb99c2656c8923f145cb1a/74866/ping.png\"\n            alt=\"/ping\"\n            title=\"/ping\"\n            loading=\"lazy\"\n            decoding=\"async\"\n            style=\"width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;\"\n          />\n        </picture>\n  </a>\n    </span></p>\n<p><code>http://localhost:3000/ping</code>にアクセスし、上記画面になれば動作確認 OK です。<br>\n以下の内容はこのデモアプリの解説になります。</p>\n<h2 id=\"プロジェクトを作成する\" style=\"position:relative;\"><a href=\"#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B\" aria-label=\"プロジェクトを作成する permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>プロジェクトを作成する</h2>\n<p>ファイル構成はこのようにします。</p>\n<p>ローカル側は<code>~/work/godemo</code>(任意のパスで OK です)、VM 側は<code>/home/vagrant/go/src/godemo</code>とします。<br>\nVagrant の Synced folder で紐付けを行っています。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">godemo/\n├── Godeps            # ライブラリの依存性定義とソースコード\n├── assets            # フロントエンドのファイル(gulpを使ってビルド)\n│   ├── dist\n│   ├── scss\n│   └── vendor\n├── controller        # コントローラ\n│   └── users.go\n├── database          # データベース接続(PostgreSQL, Redisのユーティリティ)\n│   ├── postgres.go\n│   └── redis.go\n├── model             # モデル\n│   └── user.go\n├── session           # Redisを使用したセッション管理\n│   └── session.go\n├── templates         # テンプレートファイル\n│   ├── footer.tpl    # 共通フッタ(jsの読み込みなど)\n│   ├── header.tpl    # 共通ヘッダ(metaタグ, CSSの読み込み, グローバルメニューなど)\n│   ├── index.tpl\n│   └── user_form.tpl\n├── Procfile          # Heroku用\n└── main.go           # メインファイル</code></pre></div>\n<p>※Go の構成や Heroku と直接関係のないファイルは除外しています。</p>\n<h2 id=\"heroku-にデプロイする準備\" style=\"position:relative;\"><a href=\"#heroku-%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B%E6%BA%96%E5%82%99\" aria-label=\"heroku にデプロイする準備 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Heroku にデプロイする（準備）</h2>\n<p><a href=\"https://github.com/tools/godep\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Godep</a>というツールを用いてライブラリを管理します。<br>\nくわしくは<a href=\"https://devcenter.heroku.com/articles/go-dependencies-via-godep\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Heroku のマニュアル</a>を御覧ください。</p>\n<blockquote>\n<p><a href=\"https://devcenter.heroku.com/articles/getting-started-with-go#introduction\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Getting Started with Go on Heroku | Heroku Dev Center</a></p>\n</blockquote>\n<p>ここでの疑問は、できあがった<code>Godeps/_workspace</code>というディレクトリはコミットする必要があるのか？ ignore して大丈夫なのか？ です。<br>\nマニュアルを読んでみても ignore の話が出てこないので、試してみたところ<code>_workspace</code>は ignore したらデプロイできませんでした。コミット必須なようです。</p>\n<p>Heroku で Redis を使用するには<a href=\"https://addons.heroku.com/rediscloud?utm_campaign=search&#x26;utm_medium=dashboard&#x26;utm_source=addons\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Redis Cloud</a>というアドオンが良さそうでした。ということで採用。インストールのコマンドは次の章にまとめて掲載しています。</p>\n<p>Redistore で Redis Cloud の URL を扱う際は、NewRediStore だと「too many colons」のエラーが出ます。代わりに</p>\n<ul>\n<li><code>github.com/garyburd/redigo/redis</code>と<code>github.com/soveran/redisurl</code>をインポート</li>\n<li><a href=\"https://github.com/soveran/redisurl\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">soveran/redisurl</a>を使用して、Redis.Conn を入手（デモのコード参照）</li>\n<li>それを返す関数を作成し、Redis.NewPool に渡す（デモのコード参照）</li>\n<li>NewRediStore の代わりに NewRediStoreWithPool を使用してインスタンスを生成</li>\n</ul>\n<p>redisurl は Redis.Conn を返し、NewRediStoreWithPool は redis.Pool を受け取る想定なので、変換に一手間かかりました。<br>\nかなりゴリ押し感が出てしまっているので、良い対処法をご存知の方がいらっしゃいましたらご教授いただけると幸いです。</p>\n<p>この件はこちらの記事（Stackoverflow）が参考になりました。<br>\n使っているライブラリが違うなど、直接の原因や対策が出てこず苦戦しました。まだ人口の少ない言語なので仕方ないかと思います。</p>\n<blockquote>\n<p><a href=\"http://stackoverflow.com/questions/8854682/go-json-rpc-too-many-colons\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Go – JSON-RPC – “too many colons”</a></p>\n</blockquote>\n<!---->\n<blockquote>\n<p><a href=\"http://stackoverflow.com/questions/25831869/golang-redis-error-on-heroku\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Golang Redis error on heroku</a></p>\n</blockquote>\n<h2 id=\"heroku-にデプロイする\" style=\"position:relative;\"><a href=\"#heroku-%E3%81%AB%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%99%E3%82%8B\" aria-label=\"heroku にデプロイする permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Heroku にデプロイする</h2>\n<p>ここまでくればおなじみのコマンドです。<br>\nGo は独自のビルドパックを使用する必要があるので<code>heroku create</code>コマンドの後ろに<code>--buildpack</code>オプションを渡しています。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ heroku create --buildpack https://github.com/kr/heroku-buildpack-go.git\n$ heroku addons:create rediscloud:30\n$ heroku addons:create heroku-postgresql:hobby-dev\n$ git push heroku master\n$ heroku open</code></pre></div>\n<h2 id=\"動作確認\" style=\"position:relative;\"><a href=\"#%E5%8B%95%E4%BD%9C%E7%A2%BA%E8%AA%8D\" aria-label=\"動作確認 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>動作確認</h2>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">$ heroku open</code></pre></div>\n<p>登録/ログイン/パスワードのハッシュ化/ログアウトあたりが確認できれば OK かと思います。</p>\n<h2 id=\"所感\" style=\"position:relative;\"><a href=\"#%E6%89%80%E6%84%9F\" aria-label=\"所感 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>所感</h2>\n<p>Go を触っていて思ったことの雑記です。</p>\n<h3 id=\"型を制するものが-go-を制す-\" style=\"position:relative;\"><a href=\"#%E5%9E%8B%E3%82%92%E5%88%B6%E3%81%99%E3%82%8B%E3%82%82%E3%81%AE%E3%81%8C-go-%E3%82%92%E5%88%B6%E3%81%99-\" aria-label=\"型を制するものが go を制す  permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>型を制するものが Go を制す？ ？</h3>\n<p>配列を制すものが PHP を制す、関数を制すものが js を制す、<br>\nとか他の言語で適当な標語を掲げたりしていますが、Go は type キーワードを使った片付け周りが柔軟かつ高機能なので、そこがキーになりそうだなと感じました。<br>\n現状はいまいち理解できていないので構造体しか使えてませんが、理解をしっかり深めていきたいです。</p>\n<h3 id=\"型付けコンパイルやっぱり素敵\" style=\"position:relative;\"><a href=\"#%E5%9E%8B%E4%BB%98%E3%81%91%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E3%82%84%E3%81%A3%E3%81%B1%E3%82%8A%E7%B4%A0%E6%95%B5\" aria-label=\"型付けコンパイルやっぱり素敵 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>型付け+コンパイルやっぱり素敵</h3>\n<p>C, Java, スクリプト言語と入っているので、プログラミングを始めた頃は型付け+コンパイルがお友達でした。<br>\nスクリプト言語のゆるふわさは楽で良いのですが、他の人が書いたコードはじっくり読まないと扱いにくいし破綻しやすいという感じがしています。</p>\n<p>例えば PHP なら<a href=\"http://php.net/manual/ja/language.oop5.typehinting.php\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">タイプヒンティング</a>で引数の型は縛れますが戻り値の型は矯正できません。PHP 7 でできるようになりますが、 <strong>PHP 5 で書かれたものを 7 にリプレースする体力はあるのだろうか、新規なら別に 7 で書けばいいけど言語の選択肢がある新規プロジェクトならわざわざ PHP 選択したくないよ。</strong> といった感じです。</p>\n<h3 id=\"言語構造がシンプル\" style=\"position:relative;\"><a href=\"#%E8%A8%80%E8%AA%9E%E6%A7%8B%E9%80%A0%E3%81%8C%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB\" aria-label=\"言語構造がシンプル permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>言語構造がシンプル</h3>\n<p>構文やリテラルがそこまで多くなく、機能もそこまで多いわけではないので、入門にさほど時間が要りませんでした。<br>\n型の情報も相まって、入門直後でもライブラリを使っていて分からないことは直接ソースを読めば理解できるくらいにはシンプルだなと感じました。</p>\n<h3 id=\"ドキュメント生成ツールを公式が提供\" style=\"position:relative;\"><a href=\"#%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88%E7%94%9F%E6%88%90%E3%83%84%E3%83%BC%E3%83%AB%E3%82%92%E5%85%AC%E5%BC%8F%E3%81%8C%E6%8F%90%E4%BE%9B\" aria-label=\"ドキュメント生成ツールを公式が提供 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ドキュメント生成ツールを公式が提供</h3>\n<p><a href=\"http://godoc.org/golang.org/x/tools/cmd/godoc\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">GoDoc</a>を公式が提供していることもあり、各ライブラリがきちんと API ドキュメントを公開しているのが好印象です。<br>\nライブラリが作られ Godoc も増えて洗練されて、と開発者ありきのコミュニティの下地をきちんと整えられているなーと思います。<br>\n片付け言語なこともありコメントで補わなきゃならない情報が少なく、ドキュメントと実装の型、引数が異なることもないので、ドキュメントの質も高いと思います。</p>\n<h3 id=\"gopher-の方々はレベルの高い印象\" style=\"position:relative;\"><a href=\"#gopher-%E3%81%AE%E6%96%B9%E3%80%85%E3%81%AF%E3%83%AC%E3%83%99%E3%83%AB%E3%81%AE%E9%AB%98%E3%81%84%E5%8D%B0%E8%B1%A1\" aria-label=\"gopher の方々はレベルの高い印象 permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Gopher の方々はレベルの高い印象</h3>\n<p>入門者におすすめされる言語ではない、まだメジャーではないなどが理由なのかもしれませんが、情報が少ない分クオリティが高いなと感じています。<br>\nもちろんすべてがそう、とは言えませんがクオリティが総じて高いと言っても良いんじゃないかなと思います。</p>\n<p><del>一方ぺちぺちする言語とかどこぞの宝石とか移植性キングとかクソい情報ばかり散見されるなと思ってます</del> <del>自分がレベルを下げる要因にならないよう気をつけて参ります。</del></p>\n<p>Go も人口が増えて入門者が増えればどんどんクオリティの低い情報であふれると思いますが、今なら Stackoverflow を調べればだいたいいい情報が出てきます。</p>\n<h3 id=\"起動がとにかく速い\" style=\"position:relative;\"><a href=\"#%E8%B5%B7%E5%8B%95%E3%81%8C%E3%81%A8%E3%81%AB%E3%81%8B%E3%81%8F%E9%80%9F%E3%81%84\" aria-label=\"起動がとにかく速い permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>起動がとにかく速い</h3>\n<p>サーバの起動が一瞬なのがとても良いです。<br>\nはじめて Go のサーバ立てたときに思わず <strong>「は？」</strong> と口に出してしまいました。</p>\n<p>Rails で開発していると、サーバの起動にローカルだと 20 秒くらいかかることがあって。Spring 使っても初回起動はとにかく遅いので、（何か設定間違えてるのかもしれませんが）何をするにもいちいち遅いのが個人的に嫌でした。<br>\n一方 Go はサーバの起動に 1 秒かかりません。感覚的にはサーバ起動のコマンドを入力し、Enter キーから指を離した頃には起動している、くらいです。\nとはいえ、マイクロフレームワークと重量洗車 Rails を比較するのは不平等だと思いますが。</p>\n<p>入門ついでに<a href=\"https://revel.github.io/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Revel</a>という Go のフルスタックフレームワークも試してみましたが、こちらも同様にサーバの起動が速いです。<br>\nサーバの再起動がこれだけ速ければデプロイ時の懸念事項も減ってリリースしやすいアプリが作れるのかなー、と感じました。</p>\n<h3 id=\"ビルド時に不使用の変数パッケージを検出してくれる\" style=\"position:relative;\"><a href=\"#%E3%83%93%E3%83%AB%E3%83%89%E6%99%82%E3%81%AB%E4%B8%8D%E4%BD%BF%E7%94%A8%E3%81%AE%E5%A4%89%E6%95%B0%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%92%E6%A4%9C%E5%87%BA%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B\" aria-label=\"ビルド時に不使用の変数パッケージを検出してくれる permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>ビルド時に不使用の変数、パッケージを検出してくれる</h3>\n<p>開発時にはやや不便ですが、その不便さを差し置いても素晴らしいと思います。<br>\nエラーで通らないのは当たり前で、使ってない依存性までエラーにしてくれるなんて素敵過ぎる。</p>\n<p>Go のルールになれるまでは面倒だなーと思ってましたが使ってないパッケージの import が入っていると後々のコードがどんどん汚れていきそうなので、ファイルを保存する時点で最低限の体裁を保てるあたり素晴らしいと思います。<br>\n<del>まぁそれでも保存前にビルドせずコミットする人とか居そうですけど</del></p>\n<h3 id=\"パッケージ管理周りは安定してない\" style=\"position:relative;\"><a href=\"#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E7%AE%A1%E7%90%86%E5%91%A8%E3%82%8A%E3%81%AF%E5%AE%89%E5%AE%9A%E3%81%97%E3%81%A6%E3%81%AA%E3%81%84\" aria-label=\"パッケージ管理周りは安定してない permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>パッケージ管理周りは安定してない</h3>\n<p><strong>ソースコードだけでパッケージ管理する</strong> 、という謳い文句はすごいと思いますし、ローカルで開発する文には本当にそうでびっくりしています。<br>\n設定ファイルを書かなくて良いしコマンドも<code>go get</code>だけなのでさくさくとライブラリを追加できます。</p>\n<p><strong>ソースコードから依存性を抽出する</strong> ことと前述の <strong>使用していないパッケージを import しているとエラー</strong> があるので、クリーンな依存性管理だと言えると思います。</p>\n<p>ただ Heroku にデプロイしたり、といった可搬性とバージョン管理を考えると Godep とか色々と対応策は出ているようですが、バージョンを固定するにはライブラリのソースコードをリポジトリに入れて管理しなきゃいけない状況はちょっとなぁ、、、と思います。<br>\nその点に関しては他のよくあるパッケージ管理のように Git の Tag+semver な管理に寄せてもよいんじゃないかな、と思います。</p>\n<h2 id=\"まとめ\" style=\"position:relative;\"><a href=\"#%E3%81%BE%E3%81%A8%E3%82%81\" aria-label=\"まとめ permalink\" class=\"autolink-header before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>まとめ</h2>\n<p>ということで入門記事でした。<br>\n入門直後はちょっとこの言語無理だわ…と思っていましたが、慣れてくると結構いい感じだなと思います。<strong>よくあるスクリプト言語とは別物</strong> と割り切って入門するといいかもしれません。</p>\n<p>Tour of Go で読み流してしまっているところとか結構あるので Go の勉強してきます。では。</p>","timeToRead":17,"frontmatter":{"title":"Goに入門してRedis+PostgresなアプリをHerokuにデプロイするまで","tags":["Ansible","Gin","Go","Heroku","PostgreSQL","Redis","Vagrant"],"date":"July 21, 2015","featuredImage":{"childImageSharp":{"fluid":{"tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='163'%20viewBox='0%200%20400%20163'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2082v81h401V0H0v82m72-40c-1%201%200%202%201%204%203%204%204%2012%202%2013v1l1%202-5%209-3%203-3%203h-3c-1%202-6%203-6%202h-6c-4%201-9%200-12-2l-2%201c3%208%2029%208%2034%200l2-1%201-1c2-3%203-2%203%201l1%202%202-23c0-5-6-17-7-14m174%205h-8l-9%201c-3%201-5%202-7%201l-9-1c-16-1-20%2010-15%2033%205%2019%2011%2027%2018%2021l2-1c0%204%208%205%2012%203%202-1%203%202%203%2010s5%2013%2011%2011c7-1%2010-4%2011-16l1-6%204-1c6-1%2011-4%2012-6%200-2-1-2-6-2h-6l4-8c5-9%208-22%207-27-1-9-15-15-25-12m3%204c9%206%2011%2011%2011%2026v12l3-7c3-7%206-16%206-21%200-6-8-12-17-12h-5l2%202m87%200c1%202%201%202-1%203-4%201-4%202%201%202%203%200%204%200%205%203%201%202%201%202%203%200l5-3h3l-2-2c-2%200-3-2-2-2%200-1-1-2-4-2h-6c-2-1-2-1-2%201m-130%200c-8%201-10%2015-3%2035%204%2015%207%2017%2013%2011l4-4-2-3c-3-7-1-36%203-36l1-1c0-2-9-4-16-2m21%201l-5%207c-3%207-3%208%203%207%204%200%205%200%206%202%203%203%204%2013%201%2020-2%205-2%205%200%206%202%200%203%202%203%2015%201%2012%202%2015%208%2014%207-1%208-3%2010-19l2-10-2-7c-7-13-7-19-1-21h4c2%200-1-6-5-10-7-6-18-8-24-4m86%207c-6%203-2%208%208%208%208%200%2011-1%2012-3%203-5-12-8-20-5m-189%202v31l6-2c7-3%2014-4%2017-3%202%201%202%202%202%2013v12h8V99c0-14-1-17-7-19-3-2-6-2-15%200h-4V60h-3l-4%201m213%208l-9%202%2013%206c1%200%203-1%205-4%203-4%203-6%201-6l-10%202m-115%201c-2%201-2%201-2%209%200%209%201%2012%205%2013%203%201%206-8%206-15%200-4-1-4-3-4-3-1-4-3-1-3%202-1%202-1%200-1l-5%201'%20fill='%23d3d3d3'%20fill-rule='evenodd'/%3e%3c/svg%3e","aspectRatio":2.4558823529411766,"src":"/static/1fb15308cd29c8c649fe67dfaee753b3/f8fbe/featured-image.jpg","srcSet":"/static/1fb15308cd29c8c649fe67dfaee753b3/466a3/featured-image.jpg 334w,\n/static/1fb15308cd29c8c649fe67dfaee753b3/de4e0/featured-image.jpg 668w,\n/static/1fb15308cd29c8c649fe67dfaee753b3/f8fbe/featured-image.jpg 1228w","srcWebp":"/static/1fb15308cd29c8c649fe67dfaee753b3/45ef9/featured-image.webp","srcSetWebp":"/static/1fb15308cd29c8c649fe67dfaee753b3/cd98f/featured-image.webp 334w,\n/static/1fb15308cd29c8c649fe67dfaee753b3/7535d/featured-image.webp 668w,\n/static/1fb15308cd29c8c649fe67dfaee753b3/45ef9/featured-image.webp 1228w","sizes":"(max-width: 1228px) 100vw, 1228px"}}}}}},"pageContext":{"slug":"/introduction-of-golang/","previous":{"fields":{"slug":"/how-to-test-ie-with-karma/"},"frontmatter":{"title":"Karmaを使ってIEのテストをMacから行う","tags":["ES5","Jasmine","JavaScript","Karma"]}},"next":{"fields":{"slug":"/event-report-of-yapc-asia-2015/"},"frontmatter":{"title":"YAPC 2015行ってきました","tags":["Go","ISUCON","Nginx","YAPC","カンファレンス"]}}}},
    "staticQueryHashes": ["2585454260","2954598359"]}