
Outline
前置き
最近Golangを用いたWebAPIを開発しています。
Webフレームワークにはginを利用しているのですが、そのginにおけるmiddlewareについてなかなかまとまった資料などが見当たらなかったため、実際に動かしながら確認した動きについてまとめておこうと思います。
バージョンなど
- Golang:1.10.1
- gin:1.2
基本動作
サンプルソース
ginにおけるmiddlewareの挙動を理解するために以下のようなソースを用意します。
localhost:8080にアクセスした時にmessageを持つ構造を返しています。
またsampleMiddleware()をmiddlewareとして指定しています。
package main
import (
"log"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.Use(sampleMiddleware())
r.GET("/", func(c *gin.Context) {
log.Println("main logic")
c.JSON(200, gin.H{"message": "Hello!"})
})
r.Run()
}
func sampleMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
log.Println("before logic")
c.Next()
log.Println("after logic")
}
}
挙動
上記ファイルを用意して、
go run main.go
curl localhost:8080
とコマンドを打つと、以下のようなレスポンスが返ってきます。
{"message":"Hello!"}
そしてこの時のginのログは以下のように出力されています。
before logic
main logic
after logic
[GIN] 2018/05/20 - 21:14:48 | 200 | 89.316µs | ::1 | GET /
説明
このログ出力から分かることは、middlewareとして指定したメソッドにおいて、
- c.Next()の前に記述した処理はルーティング内の処理の前に実行される
- c.Next()の後に記述した処理はルーティング内の処理の後に実行される
ということです。
これで共通の処理を前後にそれぞれ挟み込むことができるわけです。
middlewareの適用の仕方について
先の例では以下のようにmiddlewareを使用しました。
r.Use(sampleMiddleware())
全てのルーティングに共通して処理させたい場合は問題ないのですが、特定のルーティングの時だけmiddlewareを呼びたいこともあるでしょう。
そんな時は以下のようにもmiddlewareを使うこともできます。
サンプルソース
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
log.Println("main logic")
c.JSON(200, gin.H{"message": "Hello!"})
})
r.GET("/a", sampleMiddleware(), func(c *gin.Context) {
log.Println("main logic")
c.JSON(200, gin.H{"message": "Welcome!"})
})
r.Run()
}
// 省略
挙動
上記ソースを動かして、/と/aにアクセスするとginのログは以下のように出力されます。/aにアクセスした時だけmiddlewareの処理が実行されていることが分かると思います。
main logic
[GIN] 2018/05/20 - 21:26:10 | 200 | 300.4µs | ::1 | GET /
before logic
main logic
after logic
[GIN] 2018/05/20 - 21:26:20 | 200 | 251.709µs | ::1 | GET /a
Groupを利用したmiddlewareの適用
特定のルーティングにおいてmiddlewareを実行したいという時、上で説明したやり方で可能ですが、その特定のルーティングが複数ある場合はGroupルーティングを使用した方法が適切です。ログイン済みユーザーのみがアクセスできるルートを用意するのに便利です。
func main() {
r := gin.Default()
sampleGroup := r.Group("/")
sampleGroup.Use(sampleMiddleware())
{
sampleGroup.GET("/b", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "in group1"})
})
sampleGroup.GET("/c", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "in group2"})
})
}
r.GET("/", func(c *gin.Context) {
log.Println("main logic")
c.JSON(200, gin.H{"message": "Hello!"})
})
r.Run()
}
このように記述することで、/bまたは/cにアクセスされた時にのみmiddlewareを実行することが可能になります。
ちなみにmiddlewareを適用するには以下のように書くことも可能です。
sampleGroup := r.Group("/", sampleMiddleware())
{
sampleGroup.GET("/b", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "in group1"})
})
sampleGroup.GET("/c", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "in group2"})
})
}
処理をmiddleware内で終了させたい
例えば認証処理などをmiddlewareにて行い、もし不適切なリクエストであった場合、エラーレスポンスを返したいとして以下のような記述をしたとします。
package main
import (
"log"
"strconv"
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.Use(sampleMiddleware())
r.GET("/:id", func(c *gin.Context) {
log.Println("main logic")
c.JSON(200, gin.H{"message": "Hello!"})
})
r.Run()
}
func sampleMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
if id == 0 {
c.JSON(400, gin.H{"message": "invalid id"})
}
}
}
しかしこのような書き方だと、localhost:8080/0にアクセスした際のレスポンスは以下のようになります。
{"message":"invalid id"}{"message":"Hello!"}
要するにエラーコードとエラーメッセージを返しながらも以降の処理が継続されていることになります。
ログイン済みのユーザーにだけコンテンツを見せたい時などはこれでは困ります。
そういった場合はAbortを使うことで対処できます。
func sampleMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
id, _ := strconv.Atoi(c.Param("id"))
if id == 0 {
c.JSON(400, gin.H{"message": "invalid id"})
c.Abort()
}
}
}
この場合、localhost:8080/0にアクセスすると、エラーメッセージのみが返ってきます。
{"message":"invalid id"}
Abortを使うことによって、middlewareにおいて以降の処理を通すことなくレスポンスを返すことができるようになります。
まとめ
お疲れ様でした。Golangはやはり日本語資料が少なく、基本的な機能の実装においても調査の時間が取られてしまうことが多いですね。頑張りましょう。
記事内に不適切・不十分な説明がございましたら、ご指摘いただけますと助かります。
閲覧いただきありがとうございました。
- Golangでの日付のフォーマット指定の方法について
- revelでHello World
- golang の net/http で basic auth
- AWS SDK for Go を使ってS3にファイルをアップロードする
- Goでスレッドセーフなシングルトン
- GolangでSHA-256ハッシュ
- もう目移り。ちょっち迷っている
- テーブルのカラムの値をnullかゼロ値かを判別する
- Go 言語に関するブックマーク
- Goでオブジェクト指向っぽく書く
- Revel templatesを使ったサンプルアプリケーション
- GoでRabbitMQに接続してみる
- CrystalとGoでHTTPサーバのベンチマーク
- Go言語のtestで、json apiのレスポンス検証を行う
- Chefのコマンド一発でサービスを作れる状態へ(CentOS6.6)
- gopherだからgoでgopherしよう
- Go Conference 2015 summer
- gbを知ったのでgojiを使ったWEBアプリケーションプロジェクトを管理してみた
- 「Docker」と新コンテナランタイム「rkt」をサクっと比較してみる
- 開発者から見た UNIX 哲学とコマンドラインツールと Go言語
- Go言語でAmazon Linux AMI向けのビルド
- SpheroをGo言語から制御して遊んでみた
- AWSでnginx+golangが動く環境を作る
- GoのBuild Constraintsに関するメモ
- Go言語(Go-Json-Rest)でAPIサーバーを立てるときのCORS設定 (Basic認証機能付きも)
- 「連結されたgzipを1行ずつ見る」をgolangでやったらハマった
- Goでwebサーバー作るときに考えたこと
- ginのBindingとValidationについての調査メモ
- iOSアプリのライセンス一覧のplistを半自動生成して設定画面にキレイに表示するプログラムをGo言語で作った
- Goのfor rangeで思った値が取れなかった話
- GoのWEBアプリケーション運用について
- Go言語(Go-Json-Rest)のCORSでのハマり。Safariだけでハマった話。
- deploy the MVMs of gae / go
- GolangでAPIを叩く
- Goji のアプリケーションサーバーを Circus で管理する
- 画像処理で写真をアニメ風に変換する
- gvmでgoをバージョン指定で簡単インストール
- golang の進捗どうですか
- Sensuでネットワーク監視やってみた
- Web Frameworkとして検討する言語とフレームワーク
- Golangで簡単にログを吐くことを考える
- Golangで簡単に一時ファイルを吐くことを考える
- go install時にno install location for directory ○○○ outside GOPATHのエラーが出る件について
- BigQuery の課金仕様と注意点をまとめてみた(2015-07 時点)
- 社内リポジトリのサブディレクトリをgo getするにはrepo名に.gitをつける
- gomobileでiOS用のライブラリをビルドするまで
- Gobotを使ってみよう
- Golangで、ResponseWriterを使ってHTTPレスポンスを組み立てる際にハマったこと
- Go の expvar パッケージを使ってアプリケーションのメトリクスを公開する
- Golang開発環境 3分クッキング
- ipから都市情報を取得する
- 文章を非可逆圧縮して容量削減を図る
- 多重起動を禁止する
- Create,NewFile,Open,OpenFileの違い
- Goで64bitと32bitの実行ファイルを同一Windows機で作成するために講じたこと
- やはり俺のgolangがCPUを一つしか使わないのはまちがっている。
- Windowsでtail -f
- x/net/context の実装パターン
- Git.io 短縮 URL を golang コードで取得してみる
- 任意のコマンドをWebサーバー化する
- はじめての Go 言語 (on Windows) その10
- Go言語でCSVの読み書き(sjis、euc、utf8対応)
- Go言語の文字列、バイト、ルーンと文字(翻訳)
- Golangのgormで、PrimaryKeyにUUIDを使う
- tcnksm/gcli を使った golang によるコマンドライン・ツール開発について
- Go言語でプロセス間同期処理
- Golangのgormで、カスタマイズしたtime.Timeに差し変える
- Go言語は空文字に対してstrings.splitを掛けると1要素の配列を返す
- goを1.5にアップデートして1.4とベンチを取る
- runtime.Caller(1)をなめて扱ったら危険かもしれない
- GoでCLIツール作るのに便利そうなパッケージを集めてみました
- Go Mockでインタフェースのモックを作ってテストする #golang
- Goのchannelの送受信用の型について
- そろそろ真面目に Golang 開発環境について考える — GOPATH 汚染問題
- 【Go】 go fmt でコード整形
- Golang による文字エンコーディング変換
- CircleCIでService Account使ってGAE/goへdeployする
- Javaばかり書いている僕がGo言語の勉強で参考になったサイトまとめ
- Go言語の作業ディレクトリをドキュメントに従って作り直してみた
- Go言語のドキュメントに従って簡単なライブラリとテストコードを作ってみた
- 文章からダジャレのみを抜き出すコマンドを作ってみた
- Go言語の自作パッケージに説明をつけてみる その2
- Go言語 http POSTする際のContent-Type
- 【Go】import 書き方まとめ
- go言語でベンチマーク
- Goでビルドバージョン情報を参照できるようにする(Go1.5)
- Golang の文字列連結はどちらが速い?
- そろそろ真面目に Golang 開発環境について考える — Internal Packages と Vendoring
- GoとRedisでアンテナサイトを作ってみた
- Goのバッチで統計を取得するAPIを用意しておくと便利
- Go言語の練習でTODOコマンドを作ってみた
- golangでhttpを監視するscriptを書いて結果をslackにpostする
- Mithril+golang Gin を試す
- モンティ・ホール問題をGoでやってみる
- Go言語でDIを試す
- 文中の人名をイニシャルに変換して匿名化をはかる
- golang+kocha で Web アプリケーションを作ってみて
- Docker の WebUI 作りました
- Alfred Qiita WorkflowをGoで書き直した
- gbでginをrunする
- Go言語版word2vecを作ってみた
- aws-sdk-goを使ってGoからAWS SQSを使う
- 楽ができるGolangのライブラリ達
- コンソールでGithubのReadme.mdを取得するコマンドを作ってみた
- char2vecを作ってみた
- 【Go】print系関数の違い
- Go言語のChannelは送信時にもブロックする
- Goのforとgoroutineでやりがちなミスとたった一つの冴えたgo vetと
- Dockerで独自レポジトリからgo getするお
- goからiOSまで一人でアプリ開発をしてたらいつの間にかマインクラフトエンジニアになった話
- Go 1.5をRaspberry Pi 2で使う
- Goで作ったプログラムでシグナルを受け取る
- 【Go】fmt.Print とビルトイン関数の print の違い
- cgoでMacのスリープログを勝手にとって作業時間の可視化してみた
- GAE/GoのRPCにフックするライブラリaespyを作った
- struct にアノテーションつけてたら go vet . すべき
- Goで多重連想配列
- AppEngine/PythonでDjangaeを試した
- gopherjs + electron テスト
- ISUCON5予選でスコア34000を出す方法
- Go言語の練習用にTwitterのOAuth認証をフルスクラッチしてみた
- Go言語でBigQueryのクエリを実行してみる
- GolangとPEGで作る言語処理系 vol.1
- Go(goquery)でQiitaのスクレイピングライブラリをつくった
- GoでJSONとYAMLを相互変換するツールを作った
- golangでスクレイピングをする準備
- Goroutine の同時実行数を制限する
- github でホストされている go アプリを fork して PR する時には、まず go get から始めよう
- Go言語のflagパッケージより便利というoptargを使ってみる
- Go言語の開発環境セットアップ
- PHP、Node.js、Go のミドルウェアに関する調査
- golangでnestしたstructの初期化がツライ
- go言語のslice操作をまとめてみた(shiftしたりpushしたり)
- sliceのシャッフル
- golangでi18n
- Go言語でチャネルとselect
- GoのEnumイディオム
- Go速習会
- Golangで自分自身で定義したパッケージをインポートする方法あれこれ
- RPG ツクール MV のゲームをブラウザ上でテストする
- ブラウザ上で動作する[開発|実行|チュートリアル|デモ]環境を作成できるCodePicnic
- 今後イケそうなデスクトップGUIフレームワーク
- おい、peco もいいけど fzf 使えよ
- Goで外部コマンドをパイプして実行する
- [Go] ビルドツール gb を使ってみた
- Go言語で簡単にHTTPリクエストを送ってJSONをパースするサンプル
- Go1.5でHTTP2サーバーとクライアント
- GoでXMLをパースする
- [Go] HerokuにRevelでつくったアプリをデプロイする
- [golang] struct の初期化で missing type in composite literal が出た場合の対処
- RubyからGoの関数をつかう → はやい
- UnixListener.Closeでソケットファイルが消えて困っている
- Goフレームワークのパフォーマンス比較
- Goでお手軽に行列の積を爆速並列計算
- Go で UTF-8 の文字列を扱う
- GroovyからGoの関数を使う→はやい
- loggingについて話そう
- GO 1.5 と C++ を SWIG でブリッジさせる方法
- golangでシグナルを拾ってgracefulにgoroutineを停めたい・改
- PHP から Go の関数を呼び出す
- goでDotenvを使用する
- golangでImageMagickを触りたい
- Go でパラメタライズドテストをする
- まだAWSのみに頼って生きてるの?複数のクラウド利用で、大幅コストダウンした話
- 【緩募】Golangでスライスの型のキャストをする方法が知りたい
- ATOM で Go
- GoでJsonファイルを読み込んで構造体として扱う。
- Go付属のツールでオレオレ証明書を生成する
- オブジェクト指向言語としてGolangをやろうとするとハマること
- オブジェクト指向言語としてGolangをやろうとするとハマる点を整理してみる
- “Swift” vs “Swift その2” (vs Go) 戦力比較
- 全くの素人がISUCON5本戦に参加しました
- GoのGUIライブラリshinyを試す #golang
- Goで連鎖性かつスタック指向の言語を実装する
- Tour of Go (Go言語基礎文法最速マスター)日本語版を更新しました #golang
- GoのChannelを使いこなせるようになるための手引
- Go http.RoundTripper 実装ガイド
- Go言語でRedshiftとつなぐ(というかただのPostgreSQL)
- Go言語で REST API + マイクロサービス
- すごく長い行を読む場合の注意点
- golang.org/x/net/websocketの使い方とkuiperbelt
- soracom-sdk-go ベータ版でいろいろ試す
- Google App Engineのリージョン別レイテンシ
- Zaif取引所(Bitcoin/Monacoin)のAPIをGolangから使う
- Goでフィルタコマンドを怠惰に書く
- goのmgoでfindするときの処理
- GolangのOpenGL事情(WebGLも含むよ)
- lazyなGoやリスト演算なGoについて
- Go と reflect と generate
- AWS SDK for Go の基本とRoute53へのHostedZone作成とレコード作成
- Go+Webアプリケーション+CircleCIで静的解析・テスト・バイナリリリースを効率良く行なう
- 外部APIを使うController用のTest Doubleライブラリを書いた
- Exifの回転情報をピクセル情報に反映する
- Go を レンタルサーバーで動かす方法
- GoでHTTP負荷テストフレームワークをつくった
- 1行もGo書いたこと無いけどGo Conference Winter 2015に参加したので資料をまとめた
- 簡易リバースプロキシ「ichigo」でWebアプリ開発が捗る話
- glide – パッケージ管理のお困りの方へ –
- Golangで静的ファイルをバイナリに含めるライブラリを書いてみた
- GoからBLE制御でPLAYBULB Candleの操作をしてみる
- Goのjson.Decoderの使い方
- Go言語でバイトニックソート実装してみた
- Go言語入門 パッケージの作成、便利ツール、interfaceとは。
- PythonのABC – 抽象クラスとダック・タイピング
- 初心者がごるーちんでハマるところ
- GoのMemcacheパッケージ比較
- Go開発向けVim設定
- Go言語に1日で入門したときの頭の使い方の話
- go の regexp が遅いと知らずに regexp で form に fillinするモジュールを書いた
- GoとDockerとMicroservices 最初の一歩
- OS XのネイティブHypervisorを使うxhyveと、ネイティブDockerを立ち上げるdocker-machine-driver-xhyveを作った話
- 手間をかけずに形態素解析を Elasticsearch Service (on AWS) で用意する
- Goで型を挿げ替え可能なデータ構造ライブラリを作る
- Go Web Frameworks 比較
- golangでgitのサブコマンドを作ろう
- golangでrecoverしたときの戻り値
- GAE/GoでSlackの’/’(スラッシュ)コマンドサーバーを立てる
- Goでのシリアル通信でハマった事
- go-swaggerの紹介
- gomobileで日本語フォントを扱ってみる
- Vim で引き籠る
- flag 並にシンプルでより強力な CLI パーサ kingpin の紹介
- GoでGitHub通知をデスクトップ通知として取得するアプリを書いた
- Go言語でRICOH THETA API v2を叩いてみた
- GoでBLEセンサーデータをBeamする
- GunosyでのGoパッケージ構成の歴史
- Packer プラグインの書き方(Provisionerを例に)
- Goでパケットキャプチャを実践してみる
- プロダクト開発でのGoのテストとモック活用事例
- vimでGoのシンタックスチェックをquickrun+vimprocで非同期に行う
- GAE/Goでもgoroutine使おうぜ!というハナシ
- ChromebookでGo!(ChromebookでGo言語を楽しんでみる)
- 本物の golang を… 本物の Gopher を、お見せしますよ。
- コネクションプールのチューニング
- Go、Scala、Clojureで開発する3社が集結!!
- GoとAlefとLimbo
- sidekiq用のmackerelプラグイン書きました
- Goだからこそ許される3つの作法
- Go言語で実現するフォースの覚醒 (Gobotで脳波をなんとかする)
- GoでShared Libraryをビルドしてみた(簡単ドキュメント指向DB)
- はてブ ホットエントリーを一覧表示してくれるCLIツールを書いた
- GoでHTTPサーバを立てる
- 最速という噂のFlatbuffersの速度のヒミツと、導入方法の紹介(Go)
- Go言語でサーボモータをキュイキュイ動かす
- emacsでGoの環境構築をやる
- z.shをGoで書き換え(ようとしてい)る話とGoの学びかた
- GoLearnについて
- GAE/GoとGojiの組み合わせでテストを書く
- Goで3Dモデル変換してプレビュー
- slackのログをAWS(DynamoDB)にためて、検索できるようにした
- vscode-go/READMEとdelve/Buildingの日本語訳
- あるとちょっと便利なコマンドラインツール3つ
- Concurrencyについてm9(^Д^)プギャーられないための基礎知識
- ターミナル画面を勝手に共有して他人の作業を覗いてみる
- Go最後の秘宝「GUI」を探しに行く
- [golang]RevelでCSRFの対策
- Goで小さなScheme、Gigueを実装しました
- Google Cloud Monitoringのカスタムメトリクスを使ってTask Queueを監視したいズラ๑◉ﻌ◉๑
- 気楽にDynamoDBを使おう
- gonp〜Goによるdiffのアルゴリズム実装〜
- Kami – process monitor. inspired by god.rb
- nanogui.goの進捗を記録するスレ
- Goでデーモンを作るにはどうするのが良い?
- IntelliJ で Go ファイル保存時に整形する
- Go + QML + QChart.js で素敵なチャートを表示する
- GoでRESTfulなWebアプリを作りたい (go-restfulを触ってみる)
- importによってパッケージを拡張する方法(プラグイン)
- golang で AB x CD / E – F * G * H = 2016 になる全パターン洗い出し
- go 1.6でhttp.Clientが自動的にhttp/2を使わないようにする方法
- ゲームにおける正しいアイテムドロップ抽選実装
- go-redis/redis のクライアントが PubSub で共用できることを確認した
- 値渡し、ポインタ渡し、参照渡しの違い
- golang coreutils 探しメモ
- 重みをつけてランダムに何か出したい
- iOSエンジニアがGoを使ってみての所感
- CLIのWebsocketクライアントを作ってみた
- GoでhttpリクエストにHostを設定するにはreq.Headerではなくreq.Hostを使う
- Goで帳票をPDFに作成するライブラリ。 請求書などの複雑なフォーマットにも対応
- Web Application周りのテスト方法
- はじめてのGo言語 – インストール〜nginx導入まで –
- Go言語でstructをmapに変換する
- ユニットテストが書きやすい設計〜自家製モックを添えて〜
- Go言語でMongoDB使う ②埋め込みとの相性
- go testの並列(-cpuと-parallel)がなんの事だったか忘れた時のメモ #golang
- database/sql の Rows.Scan で不要なカラムデータを読み捨てる
- Go で簡単に Excelを作成するライブラリ。 色、罫線、網掛けを事前定義済
- 複雑なPDFをテキストファイルから生成。Windows,Mac,Linuxの実行ファイルなので、どの言語でも使用可能
- GoのgRPCでRemote IPを取得する方法
- 複雑なExcelをテキストファイルから生成。Windows,Mac,Linuxの実行ファイルなので、どの言語でも使用可能
- Go 1.6 でポインタをcgoの関数へ渡す際の注意点
- Go1.6でポインタをcgoの関数へ渡す際に発生するcgoCheckPointerを回避する方法
- go言語でゲーム
- 複数のgroutineが連携する通信オブジェクトの設計方針
- GoでANSIエスケープコードを扱うライブラリを作った(色付け・カーソル移動等)
- CentOS6.5にGoをインストールする
- Go で “broken pipe” を無視したい僕達がハマる罠
- iOSアプリの新規レビューを通知してくれるSlack Button Appを作った~手順と申請手続き
- Go で interface {} の中身がポインタならその参照先を取得する
- Go1.6の新機能
- golangの AriticleExtractor “GoOse” を試してみる
- [翻訳+α] Go言語の設定ファイルライブラリ Viper
- net/httpでポート443のHTTPSサーバーを立ち上げるまで
- テキストをカジュアルに暗号化したい
- GolangのGin/bindataでシングルバイナリを試してみた(+React)
- Ruby,Golang,ES2015比較チートシート
- 概観からGoのWebFrameworkを選ぶ(2016/02)
- Go の DB アクセス用のパッケージを作った
- golangの静的解析,カバレッジ解析,バイナリリリースをCircleCIで簡単に整える
- 異なる環境間で private network を構築して接続する
- vim-go-ideでさくっとGolang開発を始める
- ひとりぼっちのサービス開発における技術選択の遷移と戦略
- Golangでparserをつくって、SQLを解析してみよう!
- [golang]GoでbitFlyerのAPIへアクセスしてみた
- Goのfor文で関数のリストを作ろうとして嵌った話
- golang コーディングテストで使うメソッド・テクニックまとめ
- Go のバッファ付きチャネル close の挙動
- Golang: nil Pointer Receiverの話
- 企業動向にアンテナを張るためにQiita Organizationのキュレーションサイトを作った。
- 何も考えずMac上のGit diffでExcelの差分を見れるようにする
- Go言語でプリント文デバッグするときのTips
- HomebrewでGo 1.6を入れる
- ElectronのスタンドアロンMacアプリに無理やりGoのHTTPサーバーを仕込む
- golangでcrontabからドキュメントを作成するコマンドラインツール crondocを作った
- ファイルベースのQiitaクライアントqiitactlを作った話
- Google App Engine SDK for Goを使ってGAE上でアプリを動かすまで
- goroutine 使い方まとめ
- Go言語でGoogle Cloud Vision APIを使う
- GolangでPostgreSQLのJSONデータ型を読み書きする
- Go言語の可変長配列(slice)を使う上での注意
- Go言語で作った実行ファイルを小さくしよう!
- goでスクレイピングするのにgoquery + bluemonday が最強な件
- Go 1.6 templateパッケージ新機能
- go言語でhttpモックサーバを作る方法(2016/02時点)
- RaspberryPi1(2とzeroも)で動かすgolang製アプリをクロスコンパイル(onMac)
- GoでSpreadsheetを操作するパッケージを作った
- VisualStudioCodeでGAE/Goの環境設定
- Golang開発環境構築 in MAC
- GoでGCEからGCSにファイルを書き込む/読み込む
- 10分で終わるGo言語の開発環境構築
- Go言語のスクレイピング系ライブラリまとめ
- vagrant、ansibleでgoの開発環境を構築してみた(所要時間:15分)
- Go+goqueryでGithubRankingにWebスクレイピングを試みる
- Ginの Middleware と HandlerFunc でデータの受け渡し
- vim-goをインストールしてみた(所要時間:15分)
- GoogleAppEngine/Goのインストールから使いやすくするとこまでをさくっと 後編
- ざっくりGoの文法まとめ
- Dockerのbusybox内でgolangのtimeを使ったらエラーになった
- Golangで外部コマンドを実行する方法まとめ
- golangでlogを標準出力とテキストファイルの2箇所の出力する
- ズンドコキヨシまとめ
- Go製のData Shipper Platform「Beats」が良さそうなので紹介してみる
- Go の echo ってWebサーバーでサクッと REST しちゃう
- Go 言語 1つの構造体に複数の validation を適応する
- SensorBeeとは何か?
- あえて aws-sdk-go で dynamoDB を使うときの基本操作
- WebRTCの勉強でむりやりGo使ってみた!
- gometalinter で楽々 lint
- Golangで標準入力がパイプで渡されたものか判定する
- Goのプログラムでどういうリクエストを飛ばしているのか見たい
- Go言語をyumで入れる
- [2016年3月時点]Mac用Electronバイナリに署名してApp Storeにアップするためのメモ
- microservicesの調査に向けて〜Golang製のzipking tracerのgo-kitを利用してみる
- GAE/Go 旧appengineパッケージから新appengineパッケージ(google.golang.org/appengine)への移行ガイド
- nginx+circus+gojiによるgolang webアプリケーションの動作環境構築
- GoでJSONの一部分を利用者が定義した構造体に読み込める便利な手法を見つけた
- CentOSにGo言語をインストール
- sliceの重複チェックを高速化
- go言語初心者が図を書きながらgoroutineやgo channelを理解する(Part1)
- Golang GinでReact.jsのサーバサイドレンダリングを試してみた
- 大谷翔平の打席になったら自動でチャンネルを変える
- CSV から構造化された JSON を生成するツールを Go で作った
- コードレビューに大事な褒め言葉
- 2016年から始める Google App Engine for Go
- 【取得できた!!】IntelliJ IDEAのオープンソースライセンスでUltimate版を無料で使いたい!
- Golang (heroku) で LINE Bot 作ってみる
- GAE/GoでLINE Bot Trial
- LINE BOT をgoで作ってみたよ
- ゴルーチンで発生したエラーの返し方
- cgoを使ったCとGoのリンクの裏側 (1)
- [2016年春版] 静的サイトジェネレーターHugo導入Tips ①インストールとサイトの初期作成
- atomicパッケージが必要な理由と使い方
- go言語初心者が図を書きながらgoroutineやgo channelを理解する(Part2)
- Google App Engine for GoでOAuth2による認証を用意する
- Facebook Bot API + Go でオウム作ってみた
- go言語でのマイクロサービスフレームワークの雑な比較メモ
- Go でコメントアウトせずに素早く複数行スキップさせる
- Angular2 Tour of Heroes with Golang (w/o npm)
- GAE/Go urlfetch.ClientでGetしたらタイムアウトエラー「urlfetch: DEADLINE_EXCEEDED」の解決方法
- phonyでテスト用データを超絶簡単に作る
- Go言語のHello Worldを3分で試す
- Go Conference 2016 Spring
- GoのWebフレームワークのGoji (goji.io) をGAEで動かす
- Go製のフレームワークechoを使ってJSONを返すWebサーバーを作り、GoogleAppEngineで動かす
- Golangで、テニスの大会のエントリーページから、大会情報をクローリングしてくるサンプル
- Arukas.io CLI、まだ β なのに便利だった
- あなたのサーバは本当に安全ですか?今もっともイケてる脆弱性検知ツールVulsを使ってみた
- Goでのログ出力に標準logとcologを使う
- jsonpbはencoding/jsonより5倍遅い
- 他言語から来た人がGoを使い始めてすぐハマったこととその答え
- echoのAPIサーバ実装とエラーハンドリングの落とし穴
- ディープラーニングで「顔が似ているAV女優を教えてくれるbot」を構築
- [golang]GoのSDKで手軽にLINE BOT APIを試してみた
- 「Go言語によるWebアプリケーション開発」でハマったところ
- インタフェースを埋込む #golang
- Go言語のエラーハンドリングについて
- 愛が生まれた
- なんで愛が生まれるのか
- Goで値が文字列のJSONを構造体にパースする
- GolangのフレームワークEchoの話とHelloWorldサンプルを読み解くだけ
- UnityのネイティブプラグインをGoで書く #golang #unity
- Go製WAFのuconを触ってみた
- Terraform for さくらのクラウド
- Negroni + Gorilla/Muxで簡単なサーバーアプリケーション作る
- Goフレームワーク vs PHPフレームワーク
- Go言語で東京メトロAPIを叩く
- Cloud9でGAE/Goの環境構築
- GAE/Goで形態素解析してみた
- MySQLでのトランザクション処理をGolang+dbrで実現してゆく話
- コマンドラインからググれてもいいと思ったので作った
- Kubernetes の Go API クライアントライブラリを使って Kubernetes を直接操作する
- cgoを使ったCとGoのリンクの裏側 (2)
- Terraform for さくらのクラウド スタートガイド(第1回)
- Go言語のエラーハンドリングについて ~panic編~
- Lambda with Apex: Terraformを使った管理
- Amazon Linux に GoLang をインストールし、NginxのWebサーバを構築 & 簡単なHTTPレスポンスを受けるまで
- Gin(Golang)におけるHTMLテンプレート記述方法
- Amazon Linux に GoLang (1.5) をインストール & Gin、MongoDB (3.2) を導入し、APIサーバ を10分で作る
- Go言語の並行処理デザインパターン by Rob Pike 前編
- Go言語の並行処理デザインパターン by Rob Pike 後編
- go1.7 の気になるところを試した
- contextの使い方
- Windows に インストーラを使って GoLang を インストールするときの注意点
- HUGOで作れるCMSっぽいパーツ:関連記事・目次・JSON-LDなど
- Goのjson.Unmarshalで値にJSONのnumber、string両方の可能性がある場合
- GAE/Go+WebPushAPI+FCMでPush通知
- Hugoで新規記事を作成するときのTips的なメモ
- Go + WebDriver でブラウザ操作を自動化する
- Goでjqっぽくinterface{}の中を探索する
- go+ginでローカルで作ったWebアプリをGoogleAppEngineに載せる時に注意することまとめ
- Go+gin+dbrでセッション管理(ログイン・ログアウト)をする話+HTMLテンプレートにセッション情報を埋め込んで制御する
- Apexを使ってGoでlambdaを動かす
- labstack/echoの2.0がreleaseされてたのでAppEngineで動かしてみる
- Go+gin on GAEでBlobstoreを使ってCloudStorageにファイルをアップする話(公式ドキュメント解説を添えて)
- golangでURLをパース
- Goでパスワード入力を読み取る(Windows/Mac/Linux対応)
- Go言語による高速な接尾辞配列の実装(SA-ISの実装)
- Go で作ったゲームを Android/iOS 対応させた話 (1)
- UnityのセーブデータをGoogleAppEngine/Go(with Datastore)に保存したり読み込んだりする話
- ターミナルでスライドを再生するコマンド『pera』を作った。
- Docker Compose で Go の開発環境をサクッと作る
- GoogleスプレッドシートでGopherを描く with Go
- GAE/Go+ginでHTTPリクエストも含めてEnd to Endなテストをする話
- Github on BigQueryを使ってgoでよく使われるpackageを調べる
- Go製のフレームワークechoをHerokuで動かす
- Crystal 言語の 2016年を振り返ってみて
- Go でコードカバレッジを取得する
- 高速でダウンロードできるツールを Go で実装した。
- goでmicroserviceをつくる
- GoでGitHub Issuesのビューアを作った
- goimportsのスキャン対象から特定ディレクトリを除外する
- NHK番組表API を使ってアニメの音楽番組をslackに通知する
- (比較的)標準化をした Vuls/VulsRepo の導入
- NATSについて調べて動作を試してみた
- golang で Evernote のノートを Jekyll 用の HTML に書き出すツールを書いた
- 集合知で各言語、ライブラリ、フレームワーク、DB、アーキテクチャの適材適所をみんなでまとめたら面白いんじゃないか?
- goroutine と channel を使った並行処理のパターン
- Filebeatで複数行を扱うMultiline設定まとめ
- あなたのWebサービスでLDAPユーザ認証を実現するgo-ldapc
- golangで設定記述にTOMLを使う
- Termuxでお手軽ポケットlinux開発環境(例えばnvim+golangが手元に)
- Ubuntu 16.04 に GoLang 1.6 と Gin Web Framework をインストールし、HTMLテンプレートを読み込むまで
- Gin Web Framework と GORM を使って簡単なウェブアプリを作ってみる
- マイクロサービスのフレームワークまとめ [不定期更新](2017/02/25更新)
- WindowsのDLLをGoで作る
- Google Sheets API v4 と サービスアカウントと Go でスプレッドシートを操作する
- textqlが超便利
- CLI作成支援パッケージ Cobra を使い、Go 言語でコマンドラインツールを作ってみる
- データのバージョン管理が可能な分散データベースNomsをさわってみる
- Windows 使いの為の GAE/Go 開発環境構築
- go言語のwebフレームワークechoとpythonのwebフレームワークflaskの速度を比較してみた
- MacでGo開発環境構築
- golangの関数をまとめてみた。
- Go言語でサーバのGraceful Shutdown
- golang メソッドについてまとめてみた。
- #golang CodeReviewComments 日本語翻訳
- IntelliJ CE + Delve で Go 言語のデバッグ環境構築(Mac)
- golangではスタックとヒープを気にする必要が無い
- Go 言語で Websocket を使ったアプリケーションをつくる
- Google App Engine for Go のローカルサーバでデバッグをする #golang #GAE
- Go言語でランダムな文字列を生成する方法の比較
- Heroku への Go 言語製アプリケーションのデプロイと依存パッケージ管理方法の比較
- Docker for Macで開発環境がほんとに早くなったのか?(心の中のモヤ×100がモヤ×99になった)
- GoでAWS SDKを叩くCLIツールを作ってリリースするまでの流れ(aws-sdk-go+cobra+viper+gox+ghr)
- GAE/Goで本番のDatastoreをローカル環境に持ってくる 2016
- golang.org/x/time/rateで速度制限を行う
- インタフェースは型名を公開しなくても実装できる #golang
- ChatGopsで本物のGopherを、すぐそばに…
- 終了したことを他の複数のゴルーチンに伝えるのにチャネルのcloseを使う #golang
- Go で WebSocket を簡単に扱えるパッケージを作った
- else ifにも代入文が書ける #golang
- fmt.Formatterを実装して%vや%+vをカスタマイズしたり、%3🍺みたいな書式をつくってみよう #golang
- Go 言語の http パッケージにある Handle とか Handler とか HandleFunc とか HandlerFunc とかよくわからないままとりあえずイディオムとして使ってたのでちゃんと理解したメモ
- Go言語+Ginで相関項目チェックを実装する(テストコード含む)
- golangで部分文字列を取り出す
- Golang + Echo + MySQL まとめ
- Macでjupyter XXX (iruby, R, nodes, go) インストール
- logmon-goで簡単ログ監視
- Go 言語で JWT を使って認証と認可を低コストに
- Docker+AlpineLinux3.4+Go1.7+Nginxでfreshを使って自動ビルドする開発環境を作る
- Go 言語で Excel ファイル内の文字列を自力で置換する
- golangのioutilべしべし叩いてみた
- Golangのbundleコマンド
- Travis CI から複数ファイルを GitHub Releases にアップロードする
- gRPCを使った簡易的なマイクロサービスを作ってみた
- 競技プログラミングで使うGo言語基礎
- Go 言語 reflect チートシート
- 自宅の使用電力を見える化してみた
- Go WEBフレームワークEchoでmiddlewareを自作する
- gocsvを使ってラクにCSVファイルをつくる
- 全く新しい銀行を1から作るために必要な技術 (Monzo公式ブログより)
- Go 1.7のホスト名前解決の仕様変更
- LINE Developer Trialを GAE/Go で始める #linedevday
- スクレイピング結果をJSONで返すAPIをGAE/Goで作る。
- DatastoreからGetした時に余計なPropertyがある場合エラーになるが無視してもいい
- GoでSlackへ通知してみた
- golangでunix domain socket経由で通信するechoサーバーを書いてみた
- golangにgoto文が存在する理由
- [検証中]更新のあったファイルだけgo testを走らせテストを高速化する #golang #gae
- LINE NotifyをGoで送る #golang #linedevday
- golangで書くunix domain socketを使ったserver/clientのサンプルコード
- Goのpathとfilepathでは動作が異なる Windowsでも正しくパスを扱う
- tmux 上でバッテリーの残量が一目でわかるコマンドを Go で作った
- GoのJSON API ServerでゆるふわJSON responseを返す方法
- GAE/Go で公開鍵暗号を使う JWT 認証サーバーを作った
- Golangでエラー時にスタックトレースを表示する
- Golangでinterface{}を使ったJSONのパース
- Go言語でTodoistのCLIクライアントを作ってみた
- HerokuとGoでLINEの Messaging API環境を作ってみた
- Go のバイナリには -ldflags ‘-w -s’ でコンパイルしてもたくさんパスが埋め込まれていた
- 独自のfmt.Formatterを実装する
- Golang製DBマイグレーションツールgoose + MySQLを試してみた
- Go(golang)+HerokuでLINE Messaging APIに触れてみたよ!
- TwitterはGoでゴー。
- Go+GAE+Cloud Datastoreで簡単なREST APIを構築
- Firebase Realtime Database を Rest API と Golang でいじってみる
- Go言語でハマったNつのこと
- Go言語でJSONに泣かないためのコーディングパターン
- Firebase Notifications からメッセージを送ってみる iOS10版
- GAE/Go (echoフレームワーク)で Line Message API 使って Bot を作る。
- testeratorを使ってgae/goのunit testを高速化する
- Go で Neo Cowsay を作った
- context.Contextでリクエストスコープな値を持ち回す
- echoのv3にアップデートした時に修正した箇所
- オレオレGo入門2016
- 初心者が2016のプログラミングで思うこと
- Go言語でJSONの生成を構造体無しでJavaScript並に簡単に生成できる方法
- JSONをインタラクティブに掘り下げるコマンド jid
- go get しようとしたら SSL protocol error エラーが出るとき
- Go言語でS3にアップロードする時速度制限をかける
- PHPerに贈る、GoでWebサーバー開発環境構築
- GoでのWebアプリケーションの組み立て方
- GolangでGetWildの’89バージョンを演奏する
- boto3からaws-sdk-goにしただけでCPU使用率が75%->10%になった
- GoでSSHサーバにラインエディタが欲しいなら golang.org/x/crypto/ssh/terminal
- Golangでテストしやすいコードをかく
- 冷蔵庫の余った食材からレシピを提案するボットをリリースしました
- 新しく入ったReverse Binding機能を使ってPure GoでAndroidアプリを作ってみる #golang #gomobile
- 社内のバックエンド開発にgRPCを導入してみた
- PocketCHIPでGoのGUIアプリを動かしてみる
- 早明浦ダムの貯水率を見れるコマンド作った
- gojaを使ってGoでJavaScriptの実行を試してみた
- go言語のデバッガ(delveとgdb)とcore dump
- APIライブラリをgo-json(改)で楽に実装する
- VisualStudioCodeでGo言語開発環境を作ってみた
- Echoはver.3で結局のところ何が変わったのか?
- Go言語でファイルアップロードを使ってみる
- macの初期ターミナルでも画像を表示したい
- go-bindataで実行バイナリにWeb UIをバンドルする〜slackboardの場合〜
- 実践的なGAE/Goの構成について #golang #gcpja
- Go!プリンセスプリキュアのGo言語実装「GoPrecure」
- init関数のふしぎ #golang
- Goの構造体の研究
- Goを学びたての人が誤解しがちなtypeと構造体について #golang
- RubyistがGoに入門してDBマイグレーションツールを作った
- Goで真面目にコレクション操作ライブラリを作ってみた
- GoからCのライブラリを呼ぶ
- gorenameをライブラリとして使う #golang
- GitHubで自動生成コードをDiffに表示しない方法
- CとGolangの境界
- LINEBOT SDK GOを使って月曜日のたわわBOTを作った。
- git管理ファイルを透過的に暗号化するgit用フィルタを作った
- GetWildの信号強度を解析し、音の大きさを可視化する
- 秒間500件以上のLOGフローアーキテクチャ
- Go でツール書くときの Makefile 晒す
- GolangでKey-Valueリソースのキャッシュと分散合意によるコミットをする
- GAE/Go で巨大な Zip を扱う
- golangの開発で使っている色々
- Hacker Newsを一覧表示してくれるCLIツールを書いた
- Golangのconst識別子iotaの紹介
- Go言語をMacにインストールしてみる(goenv + direnv + glide)

Androidに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

AWSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Bitcoinに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

CentOSに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

dockerに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

GitHubに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Goに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Javaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

JavaScriptに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Laravelに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Pythonに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Rubyに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Scalaに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Swiftに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Unityに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Vue.jsに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

Wordpressに関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。

機械学習に関する現役のエンジニアのノウハウ・トレンドのトピックなど技術的な情報を提供しています。コード・プログラムの丁寧な解説をはじめ、初心者にもわかりやすいように写真や動画を多く使用しています。