本当にただのメモ

なるべく Qiita に投稿しよう

go

vgo メモ

go

https://qiita.com/nekketsuuu/items/589bc29f00b507492a96 依存関係は ./go.mod に記述する サブコマンド 説明 vgo build 依存を解決しつつ go build vgo list -m 依存モジュールを出力 vgo list -m -u 依存モジュールでバージョンが古いものがないかを出力…

Go/GAE 雑感

Go

Go 好きなところ イマイチに感じるところ GAE Go 好きなところ 型がある安心感 リファクタリングとか、不要なコードを消すときの安心感が違う 型がある割には記述が冗長に感じない エラー処理を強制させられるので誰に書かせても安心(もちろん自分で書いて…

構造体の埋め込みメモ

Go

こういう埋め込みをする場合。 type Foo struct { Name string } type Bar struct { Foo Gender string } 初期化 これはエラー。 bar := Bar{ Name: "John", Gender: "Female" } こうしないといけない。 bar := Bar{ Foo{ Name: "John" }, Gender: "Female" …

Go のライブラリを作るにあたり使ったもの・参考にしたもの

go

依存解決ライブラリ (dep) の使い方 dep(Go dependency tool)を自作ライブラリに使ってみた - Qiita

ヒアドキュメントのインデントを下げる

go

そういうパッケージがある。見やすい。 逆引きGolang (文字列)

time.Now() はローカルの Location を自動でセットする

go

なぜか自分は、UTC がセットされると思い込んでた。。 下記のコードは日本時間の 05:30:33 に実行したもの。 package main import ( "fmt" "time" ) func main() { format := "20060102T150405Z" // デフォルトではローカルの Location が使用される fmt.Pri…

Stringer を実装していない struct を Stringer 対応させたい場合

go

struct の埋め込みを駆使すれば良い。 勿論このテクニックは他の interface でも応用可。 package main import "fmt" type Person struct { Name string } type PersonStringer struct { Person } func (p PersonStringer) String() string { return "My nam…

JSON の Diff をとる

go

追記: ライブラリを作った。 Go のプログラム内で JSON を比較しやすくする - Qiita ー ー ー ー ー API がやや冗長な感じがしてあんまり好きになれない。。が、これしか見つけられなかった。 package main import ( "encoding/json" "fmt" diff "github.com…

Go はなるべく正規表現を避ける流儀っぽい

go

コンパイルにそれなりにコストがかかるらしいので。 例えば、正規表現を避ける 以下あんちょこ。 ある文字列を含む 前後の余計な文字を削る 文字列置換 ある文字列を含む ok := strings.HasPrefix("abcde", "abc") HasPrefix HasPostfix Contains Index Last…

Go のエラーは %#v で出力すると吉

go

どの package の処理でエラーになったのかが明解になり、トラブルシューティングの助けになる。 ただ、個人的には %T: %s が一番分かりやすくて好き。書き方がちょっとダサいけど ... 。 package main import ( "encoding/json" "fmt" ) type Foo struct { N…

Go でテストしやすくするいくつかの方法

go

HTTP リクエストを mock する DI する 関数を Stub する HTTP リクエストを mock する GolangでHTTPサーバのモックを使ってテストを実行する。 - タチコマ好きなエンジニアのブログ httpmock を使えば良い httptest でもできるが、endpoint を差し替える必要…

bytes.Buffer

go

Go でバイナリ処理 - Qiita []byte をラップして Read(), Write() などを付けるもの。 つまり Buffer にすれば io.ReadWriter を満たすので、 io.ReadWriter を引数にするライブラリなどで使える。(ioutil / bufio etc) あとで読みたい I/O を伴うテストには…

Go と stream のあれこれ

go

Golangでのstreamの扱い方を学ぶ - Carpe Diem 要約: Streamで扱っているものはStreamのまま扱う( = io.Reader を毎回 ioutil.ReadAll で[]byteに変換せずにそのまま使う)。 理由: メモリの効率化。 ioutil.ReadAll などで一旦全て []byte に変換すると、…

配列を先頭から N 個ずつ取り出す

go

多分 C とかでも同じコードになると思うけど、普段 LL でこういうコードを書くときライブラリを使うので、意外と見慣れず初見で「!?」となってしまった ... 。 package main import "fmt" const N = 3 func main() { a := []string{"a", "b", "c", "d", "e…

io.ReadCloser を mock する

go

io.ReadCloser を引数にとる関数のテストを書きたかった。 結論、 bytes.Buffer と ioutil.NopCloser を組み合わせれば良い。 package main import ( "bytes" "fmt" "io" "io/ioutil" ) func main() { read( ioutil.NopCloser(bytes.NewBufferString("This i…

スライスを破壊的に変更

go

スライスは配列の参照なので、ポインタレシーバじゃなくても書き換えられるのがポイント。 range の第二引数は要素の コピー だけど、 slice[i] だと 参照 になる ... というのすぐ忘れる(覚えられない)。 package main import "fmt" type People []Person…