golang
go/types関連の関数などの使い方をメモしておくと便利なのでメモ。おそらく一番わかり易い例として電卓の様な振る舞いをするようなものを作ってみる。 かんたんな数式の計算(電卓) たまにgo/typesのEval()に触れる記事の中でpkgにnilを渡して数式をする例を…
goでmockを自動生成する以外に大きなinterfaceを扱う方法を考えたりしてた。基本的には綺麗に小さく分割するが正解であるし。そうするべきなのだけれど。それ以外の方法を考えたのでメモしておく。あとから見直してもちょっとトリッキーだと思うので常用する…
goでのslack通知(mail通知)のコードについて考えたりしていた。とりあえずの段階ではdispatcherという構造で管理するのが良さそうという感じにはなった。 ただ、色々な階層でのテストなどのことを考えるともう少し考えることがありそうな感じがしている。 di…
goで排他なフィールドとinvalidなzero valueではまった。 (短く言うならポインターにするべきところでポインターになっていなかったという話) 排他なフィールド 排他なフィールドを持っているstructと言うのはこういう形。 // T : type T int // const ( TX …
はてなブログのクライアントを書いている時にxmlをPOSTする必要があった。考えるのが面倒だったので text/template を使っていたのだけれど。 これでは問題があった。本文がescapeされないのでinvalidなrequestになってしまう。 具体的にはこういう話。 pack…
~はだめ os.Openは"~“をhome directoryとして空気を読んで良い感じに解釈してくれないっぽい。 // 01tilda.go package main import ( "io" "log" "os" ) func main() { filename := "~/.screenrc" f, err := os.Open(filename) if err != nil { log.Fatal(er…
はじめに 通常の言語だと、多値とdestructuring(分配束縛)は別物で、単一の構造体をバラす構文が入っているという感じのことが多い(schemeなどではそれとは全く別に多値を返す事ができるけれど。一方でbindingのための構文が別途用意されている)。例えばpyth…
github.com hatenaはoauth1.0aっぽいのでわりとだるかった。 インストール $ go get github.com/podhmo/hatena/cmd/hatena 使い方 新規投稿と編集を手軽にやりたかった。投稿した時点でaliasを覚えてくれるので編集が楽。 # 新規投稿 $ hatena -alias foo fo…
github.com おそらくニッチな話になってしまっているけれど。メモ。 はじめに goawayを使ってコード生成をしたときの典型的なコードの利用方法は以下の様な形になる。 $ python myscript.py --package=github.com/podhmo/myscript --position=. # 実際にGOPA…
github.com もうちょっと複雑なpythonでgoのコードを生成する例を紹介して見ることにした。具体的にはswagger specを見てgoのstructを生成する処理。 go-swaggerなどswagger specからgoのコードを生成するツールは既にあったりはするのだけれど。これと似た…
github.com pythonでgoを書くためのユーティリティ的なライブラリを作り始めました。良い名前が見つかったので進捗がありました。 できること できることは少しずつ増えていく予定です。 structの定義 例えば、以下の様な感じでstructを定義できます。 from …
github.com テキトウな設定ファイル(yaml,json)から、swagger specを生成して、goのstructを定義してloadしてみることにしてみた。 生成されるswagger specとgoのstruct定義は雛形っぽい感じであんまり真面目に作っていない。とりあえず雰囲気だけでも分かる…
zero valueを設定する際に循環してしまうと無限に再帰してしまい終わらないという話。 例えば以下のような定義はダメ。 自分自身で再帰 type Tree struct { Value int Left Tree Right Tree } もちろん、ポインターにしてあげれば、nilがzero valueになるの…
以下の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.7とgo1.6とで動作が異なるのではないか?という疑いをもった時があった。 ところで手元の環境は全部1.7でわざわざ1.6をbuildするのも面倒と言うような感じ。 本当に些細なコードだったので、goの1.6用の…
はじめに 例えば、以下のような状況で 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を出力しようとすると、エラーになるという話を知らなかった。 全部public 例えば、以下はOK type User struct { Name string Message string } type V map[string]interface{} func main() { const tmpl = `{{.user.N…
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で何らかの後片付けをする。 この後片付けのタイミングでerrorが発生。 この時、deferの中の処理で発生したerrorを戻り値として返したい。このような事をしようとした場合にnamed returnを使うしかなかったという話…
前提 $ 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…
これは何? gistのuploadを手軽にするやつです。goの勉強のための習作でした。 https://github.com/podhmo/selfish 経緯 以前から結構gistを頻繁に利用していて、特に複数ファイルをuploadしたい場合には、web画面からポチポチとファイルを指定していくので…
tl;dr panic時ではなくerror時にもfullのstack traceが欲しい pkg/errors が便利 はじめに しばらくgoを書いていて、使い捨てのコードのエラー処理についてどうすれば良いのか考えたりしていた。ここで言う使い捨てのコードというのは1ファイル位で作れそう…
まじめに調べるなら以下を見たほうが良い。 https://golang.org/pkg/fmt/ reflection使った便利な出力 %T 値の方を表示 %v 値を良い感じに表示 %+v +フラグ付きで冗長出力表示。 %#v 値を型名やフィールド名も含めて出力 利用例 type Person struct { Name s…
はじめに 他の言語のつもりで比較演算子を使うと想定外の挙動をするということもあったりする。最初テキトウにコードを書いて挙動を確認しようとしていたが後に言語仕様を読めば良いだけだということに気づいた。学び始めの最中に思ったことをメモしておくと…
[wip][golang]golangのcallbackとdeferの実行順序と表示される値について はじめに 以下のものを使った際の実行順序を調べたい。 defer callback closure(ついで) テキトウなコード テキトウなコードを書いて調べる。 10. 20. 30 という数値を持ったslicesの…
[golang][wip]golangで型のmappingがないjsonをいじる golangで型のmappingがないjsonをいじる時には interface{} で受け取って色々やれば良いらしい。 型でswitchできるのでどうにかなる。 memo bytes.BufferはStringIO的なもの 型でswitchする時mapかslice…
golang の encoding/json/encode.go を読んでたしかにcacheにlockは必要だな〜と思ったりした encoding/json付近を眺めていた。 encoding/json source ぱっと見reflectの使い方などの把握にも良さそうだと思ったがまだ正確には理解しきれていないのでそれに…
golangのsort packageを見ながらcollection系の構造をどうやって管理するか把握しようとした はじめに golangにgenericsがない。genericsがない状況でcollection系のデータ構造をどうするのかという話。 結論から言うとinterfaceを定義して頑張る。 sort pac…
[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してみる golang で今使っている go コマンド自体のソースコードを見る方法が意外と楽に提供されているのでmemo。 現在の go コマンドが利用しているソースコードの位置を調べる go tool …