読者です 読者をやめる 読者になる 読者になる

invalid recursive type XXX

zero valueを設定する際に循環してしまうと無限に再帰してしまい終わらないという話。 例えば以下のような定義はダメ。 自分自身で再帰 type Tree struct { Value int Left Tree Right Tree } もちろん、ポインターにしてあげれば、nilがzero valueになるの…

httptestでmock server的なものを作る方法のメモ

以下の3つが欲しい get post (form) post (json) package m import ( "bytes" "encoding/json" "net/http" "net/http/httptest" "net/url" "testing" "io/ioutil" "github.com/pkg/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testi…

手軽にgo1.6を試す方法考える -> 結局dockerを使うことにした

はじめに 期待していない挙動を示した時にそもそもgo1.7とgo1.6とで動作が異なるのではないか?という疑いをもった時があった。 ところで手元の環境は全部1.7でわざわざ1.6をbuildするのも面倒と言うような感じ。 本当に些細なコードだったので、goの1.6用の…

既存のmethodを壊さずに内部のmethodを差し替えて実行したい

はじめに 例えば、以下のような状況で M.F0() を呼びたい。しかしその内部で呼ばれる m.f()は呼んでほしくない場合。 type M struct { } func (m *M) F0() error { // do something return m.f() } func (m *M) F1() error { // do something return m.f() }…

goのtext/templateでprivateなattributeを出力しようとするとエラーになるという話

goのtext/templateでprivateなattributeを出力しようとすると、エラーになるという話を知らなかった。 全部public 例えば、以下はOK type User struct { Name string Message string } type V map[string]interface{} func main() { const tmpl = `{{.user.N…

goを1.7に上げてから、gocodeが動かなくなったりもしました

go1.6.2 -> go1.7でgocodeが動作しない 手元のmacの環境のgoを1.7に上げたところ、gocodeが上手く動作しなくなった。 (macportsを使っている) $ sudo port selfupdate $ sudo port upgrade go $ go version go version go1.7 darwin/amd64 以下の様な感じの…

deferのタイミングで関数の戻り値を変えたい場合には、named return使うしかないのかも?

はじめに 例えば、以下の様な状況。 deferで何らかの後片付けをする。 この後片付けのタイミングでerrorが発生。 この時、deferの中の処理で発生したerrorを戻り値として返したい。このような事をしようとした場合にnamed returnを使うしかなかったという話…

godocが無いと言われたあと、godocインストールに権限が無いと言われた話

前提 $ go version go version go1.6.2 darwin/amd64 はじめに そもそも go doc と godoc が別ものだということに気づいていなかった。2つは別物。 そもそも取得する引数なども異なる。 go doc $ go doc -h Usage of [go] doc: .. snip Flags: -c symbol mat…

そう言えば、selfishというツール作っていました

これは何? gistのuploadを手軽にするやつです。goの勉強のための習作でした。 https://github.com/podhmo/selfish 経緯 以前から結構gistを頻繁に利用していて、特に複数ファイルをuploadしたい場合には、web画面からポチポチとファイルを指定していくので…

使い捨てのコードのエラー処理について

tl;dr panic時ではなくerror時にもfullのstack traceが欲しい pkg/errors が便利 はじめに しばらくgoを書いていて、使い捨てのコードのエラー処理についてどうすれば良いのか考えたりしていた。ここで言う使い捨てのコードというのは1ファイル位で作れそう…

golangのfmt系のformatの機能のメモ

まじめに調べるなら以下を見たほうが良い。 https://golang.org/pkg/fmt/ reflection使った便利な出力 %T 値の方を表示 %v 値を良い感じに表示 %+v +フラグ付きで冗長出力表示。 %#v 値を型名やフィールド名も含めて出力 利用例 type Person struct { Name s…

golangのequalityの評価について

はじめに 他の言語のつもりで比較演算子を使うと想定外の挙動をするということもあったりする。最初テキトウにコードを書いて挙動を確認しようとしていたが後に言語仕様を読めば良いだけだということに気づいた。学び始めの最中に思ったことをメモしておくと…

golangのcallbackとdeferの実行順序と表示される値について

[wip][golang]golangのcallbackとdeferの実行順序と表示される値について はじめに 以下のものを使った際の実行順序を調べたい。 defer callback closure(ついで) テキトウなコード テキトウなコードを書いて調べる。 10. 20. 30 という数値を持ったslicesの…

golangで型のmappingがないjsonをいじる方法のメモ

[golang][wip]golangで型のmappingがないjsonをいじる golangで型のmappingがないjsonをいじる時には interface{} で受け取って色々やれば良いらしい。 型でswitchできるのでどうにかなる。 memo bytes.BufferはStringIO的なもの 型でswitchする時mapかslice…

golangの encoding/json/encode.go を読んでたしかにcacheにlockは必要だな〜と思ったりした

golang の encoding/json/encode.go を読んでたしかにcacheにlockは必要だな〜と思ったりした encoding/json付近を眺めていた。 encoding/json source ぱっと見reflectの使い方などの把握にも良さそうだと思ったがまだ正確には理解しきれていないのでそれに…

golangのsort packageを見ながらcollection系の構造をどうやって管理するか把握しようとした

golangのsort packageを見ながらcollection系の構造をどうやって管理するか把握しようとした はじめに golangにgenericsがない。genericsがない状況でcollection系のデータ構造をどうするのかという話。 結論から言うとinterfaceを定義して頑張る。 sort pac…

golangの勉強のためにimport packageで読み込まれるファイルについて調べようとしていた

[wip] golangの勉強のためにimport packageで読み込まれるファイルについて調べようとしていた はじめに The Go package sources are intended to serve not only as the core library but also as examples of how to use the language Effective Goで標準…

MacPortsでインストールしたgolangのコードにちょっと手を加えてbuildしてみる

MacPortsでインストールしたgolangのコードにちょっと手を加えてbuildしてみる golang で今使っている go コマンド自体のソースコードを見る方法が意外と楽に提供されているのでmemo。 現在の go コマンドが利用しているソースコードの位置を調べる go tool …

ぷよぷよ in golang

qiitaで見かけたので