go

iTerm2で goapp test の実行結果を見やすくする

goapp test で単体テストを走らせた時に RUN/PASS/FAIL が見づらいので iTerm2 で goapp test を見やすくする設定を追加します。 設定方法 Preference > Profile > Advanced > Triggers で特定の文字列だった時にハイライトさせるTriggerを設定します。 例え…

引数で指定した型で出力する型を変更するTips part2

go

昨日以下のエントリを書きましたが json.Unmarshal versionで書いていたので stream でレスポンスを扱う方も追加で記載します。 ema-hiro.hatenablog.com streamを使うパターン func HogeSetter(url string, out interface{}) error { resp, err := http.Get…

引数で指定した型で出力する型を変更するTips

go

課題感 goは静的型付き言語でfuncの返り値に指定した型は厳格に守る必要があります。 一方で返り値のみ異なるケースで内部の実装の詳細が型以外ほぼ同じような関数を定義したいときは結構あります。 goだと特に同じようなコードを書くことになりがちでこれを…

AppEngineについて考えてること

AppEngine大好きっ子で1年近くAppEngineをPaaSに採用した環境で開発を行ってきた人間としてちょっと考えたことをつらつら書いてみます。 ※1 このエントリは今日(2018/09/21)同僚の人と色々話してた内容をベースにしてます。 ※2 あくまで個人の感想、というか…

Test時に値を書き換えて元に戻すサンプル

go

メルカリさんのこのブログを呼んで表題のテスト時に置ける値の一時的な書き換えとresetの方法がとても便利だったのでメモりました。 tech.mercari.com テストを回すときに実際のURLでなく適当なダミーURLを叩いてHTTPのレスポンスをモックしたい場合があると…

Table Driven Testのテストケースの書き方について

go

Goでは単体テストを書く場合に Table Driven Test が可読性、保守性の観点から推奨されています。 そのTableDrivenTestにおいてテストケースの書き方について備忘録です。 テストケースの書き方 ケースごとのstructを定義する 以下のようなコードを想定しま…

localでのgoの管理においてbrewをやめた話

go

Overview goのversionを複数使いたいケースにおいて brewを使ってしまうと常に最新のgoのversionになってしまいます。 複数versionを管理するために goenv もありますが、高々goのversion管理のためだけに新しいツールを入れたりすると無駄な依存を発生させ…

goappコマンドを入れ直した話

Overview GAEを使う場合、localにapp-engineのSDKを入れる必要があります。 少し前までは brew install app-engine-go-64 を叩くと goapp コマンドがlocalにinstallされ、使うことができましたが、ある時から formulla から消えてしまい、brew 経由でDLする…

goimportsでlocalのパッケージのsort順序を編集する。

-local付きでgoimportsする goのformatとimportパッケージをよしなにしてくれる goimports コマンドですが、localで独自に定義したpackageをimportするときにこんな風に並んでほしいことが多いです。 import( // 標準pkg // github.comとか有名所pkg // loca…

go get 時の `import path does not begin with hostname` でハマった話

go

1年近くGo書いててGOROOTの設定が間違ってたっていう話を書くのもお恥ずかしい話ではあるんですが備忘録のため 環境としては brewでgoを入れている gorootをテキトーにしか設定してなかった($HOME/goみたいな) エラーの内容は go get コマンドを叩くと pack…

【Go】WebサーバーでLogを表示する

go

やりたいこと Goで立てた簡易webサーバーにアクセスした時に標準出力でLogを表示させるようにします。 webサーバーを立てる /src/todo main.gp handler/main.gp main.go package main import ( "fmt" "net/http" "todos/handler" ) var addr = ":3000" func …

ポインタ型のvarでの初期化でハマった話

go

ハマったところ CLIで特定の画像をbinary化してから画像にしてPostで送信する、というコードを書こうと思った時にポインタ型の初期化についてハマったのでメモ。 ざっくり書きたかったコードは以下(※ コードは適当) func UploadImgFile() error { // 画像を…

GCSに保存してあるデータを取得する

※ 当たり前のことでドキュメント通読すればいい話ですが、ちょっとハマったので備忘録として書きました。 Google Cloud Storage(GCS)に保存してあるデータを取得するという話です。 GCSから取得する時 storageパッケージを使います。 godoc.org データを取得…

空のstructにはomitemptyが効かない

go

以下のようなコードを書いたときに https://play.golang.org/p/JVvctX-ir-w {} を返ってくることを期待しているのに、 {"field":{}} が返ってくる、ということにずっとハマっていました。 これは encoding/json の omitempty の振る舞いとして空のstructにom…

gin✕GAEの環境でhandlerのunittestを書く

前提 goのhandlerレイヤー、MVCのApplicationで言うところのcontrollerのレイヤーのテストを今まで書いてきたことは少なかったのですが、意図しないinputに対して、正常なレスポンスを返さない(400とか401とかを返す)ようなEPを想定した時にhandlerとは言え…

gae上のアプリに対してService Workerを登録する

やりたいこと gae上で動いているアプリに対してService Workerを登録します。 やること service worker用のjsファイル sw.js を登録すること。 sw.js ファイルのレスポンスヘッダーに Service-Worker-Allowed:/ を登録すること。 手順 1. sw.jsを読み込むに…

【Golang】部分文字列を抽出する

go

golangの文字列から特定の位置の文字を取り出したい時に [:] を使えます。 package main import ( "fmt" ) func main() { s := "abcdefg" fmt.Printf("%+v\n", s[:]) fmt.Printf("%+v\n", s[1:3]) } /* output > abcdefg > bc */ cf. https://play.golang.or…

GoLandでriotのtagファイルをシンタックスハイライトする

Overview GoLand(というかIntelliJ)がデフォルトで対応していないtemplateファイルをカスタム登録する方法 以前tmplファイルの設定方法は書きました ema-hiro.hatenablog.com 手順 前回と同様です。 Preference ▶ Editor ▶ FileType ▶ HTMLを選択。 riot.js…

Use httpmock with fmt

go

Summary golangのhttpのmocking packageである httpmock で fmt packageを使ってstring型に変換したときにハマった話を書きます。 httpmock packageはこちら github.com How to Use var resJson = ` { "id": 1, "name": "taro" } ` func TestHttpMock(t *tes…

GraphQLを書いてみた話

仕事ではjson-shemaを使ったRESTを使っています。 API定義がドキュメント化されていることの意義 マイクロサービスアーキテクチャを元に開発していると、コンポーネント間のインターフェースの定義なしにはやっていけないと感じています。 もしjson-schemaが…

Goにおける簡易だけど最低限の情報が入っているerror出力方法の知見

go

errorについての検討 golangはerrorまで含めて愚直に書くことが求められたりして、それはそれで慣れではあるなーと感じているのですが、errorのformatが人に依存したり、1人で個人開発とかしているとerrorをちゃんと書いてるのがめんどくさくなったりするの…

structのomitemptyの挙動と使い所の検討

go

golangのstructでjsonのencodingのためのpropertyに omitempty をつけた時の挙動とその使いどこを検討します。 omitemptyタグとは https://golang.org/pkg/encoding/json/#Marshal には以下の用に記載されている。 The "omitempty" option specifies that th…

structに埋め込んだmapの要素を上書きする

go

やりたいこと struct内に埋め込んだmapのfieldの値を上書きするという処理を考えます。 下記のようなサンプルコードがあったときに originalSamples のItemsの中身を上書きするような処理です。 type Samples struct { Items map[string]string } originalSa…

goで任意引数でtemplateでの表示を変えたりしたい場合の考察

go

golangで関数に任意引数を取り、その任意引数にmapを指定することで、template場でmapで定義したinterfaceを見て表示を変えたいという実装を考えます。 やりたいこと 以下のようなことをしたいと想定します。 func RendarHTML (flags ...map["string"]interf…

goのテストのカバレッジを計測する

go

関わっているプロダクトでテストのカバレッジ取得してみようと思ったので、標準で動作している機能を使ってgoのテストカバレッジを計測してみました。 coverageを計測する coverageを測定するpackageを指定して、カバレッジを図るオプション -cover を指定し…

【学習】「GOならわかるシステムプログラミング」~Chapter 3~

go

※「GOならわかるシステムプログラミング」の3章の学習記録です。 主に PNGファイルを分析してみる PNGファイルに秘密のテキストを入れてみる の2節の内容の学習記録です。 sample sampleコードは以下 package main import ( "bytes" "encoding/binary" "fmt"…

json.Unmarshalではnilの参照型へのmappingはできない

go

httpレスポンスを構造体にmappingする際に以下のようなコードを書くケースは多々あると思います。 ※ error handlingは割愛 // responseの取得 resp, _ := http.Get(url) body := resp.Body defer body.Close() // []byteへの変換 b, _ := ioutil.ReadAll(bod…

これからはgoのstreamを使っていこうと思った話

go

これからgoでjson形式のデータをstructにmappingする際にはstreamを使うことを決意した話です。 経緯 下記のエントリーに触発されました。 christina04.hatenablog.com goでjsonをstructにmappingすることをはじめ、 io.Reader のデータを扱うときは一度 []b…

goでAPIのスケルトンを作成する

以前書いた以下のエントリーからさらい一歩進めました。 ema-hiro.hatenablog.com ema-hiro.hatenablog.com 内容は net/http かgorilla/mux を使ってroutingを作る超薄いAPIサーバーを作成する際にこれだけコピれば簡単にapiサーバーを立てることができるみ…

GolangではてなのRSSを取得するクライアントを作成する

go

仕様 はてなのRSSのfeedのURLを登録する 登録したURLでRSSを取得する RSSをparseする 実装 sampleでは、はてなの「テクノロジー」のホットエントリーを使用する。 http://b.hatena.ne.jp/hotentry/it.rss 実際に叩いてみる $ curl -i http://b.hatena.ne.jp/…