golang

strangejsonで生成されるUnmarshalJSONのコードを短くした

github.com 生成されるUnmarshalJSONのコードを短くした。具体的にやったことはnewtype的に定義したstructのunmarsalをcastで済ませるようにした。 生成されるUnmarshalJSON 例えば以下のようなstruct定義で生成されるUnmarshalJSONは以下のようなもの。 // …

packageからfilepathを推測する方法あるいはその逆

packageからfilepathを推測する方法などをまとめておきたかった。 (ついでに個人的な信仰からホームディレクトリは~になっている) packageからfilepath package main import ( "go/build" "os" "os/user" "path/filepath" "strings" "github.com/pkg/errors"…

strangejson最近の進捗はJSONのunmarshal部分の生成ができるようになったこと

github.com まだ開発中で完成はしていないですが。strangejsonは最近の進捗によりJSONのunmarshal部分の生成ができるようになりました。 これはどういうことかと言うと以下のコードから。 github.com/podhmo/strangejson/examples/pointer02/person.go packa…

golangの現在のファイルのimport関係に即したTypeStringの表記を作る

TypeString? go/typesにQuqlifierという型がある。これと一緒にTypeStringという関数がある(いずれも、GOROOT/src/go/types/typestring.goに定義されている)。これらは型情報付きの表記をするために使われる。 type Qualifier func(*Package) string // Type…

遊びでstrangejsonというgoのstructの定義とswagger定義(のようなもの)を行ったり来たりするようなものを作り始めた

github.com strangejsonというgoのstructの定義とswagger定義(のようなもの)との間を行ったり来たりするようなものを作り始めた。まだ完成はしていない。 何をするもの? 何をするものかと言うと goのstructの定義を見てswagger形式のschema定義(まだ確定は…

goでstructの定義を見てあれこれするのに、ast.Fileを直接見るよりtypes.Packageを参照したほうが楽(かもしれない)

goでstructの定義を見てあれこれしたいことがある。特にコード生成などの文脈が多い。このような時に巷の記事や情報などではASTをがんばって解析するという方法が紹介されている事が多い。それよりもtypes.Package経由で*types.Objectを触ったほうが便利だよ…

goでJSONのunmarshal時のrequiredなfieldの扱いについて

TL;DR goであんまりfieldにpointerを使いたくない required,unrequiredを表現するときにはpointerを使わざる負えない? unmarshal時に自分でチェックすればやれないこともない はじめに goのJSONへの対応について悩まされる事が多い。色々試行錯誤を繰り返し…

go/typesのEval()でリテラルを扱った数値計算のその先

go/types関連の関数などの使い方をメモしておくと便利なのでメモ。おそらく一番わかり易い例として電卓の様な振る舞いをするようなものを作ってみる。 かんたんな数式の計算(電卓) たまにgo/typesのEval()に触れる記事の中でpkgにnilを渡して数式をする例を…

goでmockを自動生成する以外に大きなinterfaceを扱う方法を考えたりしてた

goでmockを自動生成する以外に大きなinterfaceを扱う方法を考えたりしてた。基本的には綺麗に小さく分割するが正解であるし。そうするべきなのだけれど。それ以外の方法を考えたのでメモしておく。あとから見直してもちょっとトリッキーだと思うので常用する…

goでのslack通知(mail通知)のコードについて考えたりしていた

goでのslack通知(mail通知)のコードについて考えたりしていた。とりあえずの段階ではdispatcherという構造で管理するのが良さそうという感じにはなった。 ただ、色々な階層でのテストなどのことを考えるともう少し考えることがありそうな感じがしている。 di…

排他なフィールドとinvalidなzero valueでハマった話

goで排他なフィールドとinvalidなzero valueではまった。 (短く言うならポインターにするべきところでポインターになっていなかったという話) 排他なフィールド 排他なフィールドを持っているstructと言うのはこういう形。 // T : type T int // const ( TX …

goでxmlをescapeする話

はてなブログのクライアントを書いている時にxmlをPOSTする必要があった。考えるのが面倒だったので text/template を使っていたのだけれど。 これでは問題があった。本文がescapeされないのでinvalidなrequestになってしまう。 具体的にはこういう話。 pack…

goのos.Openは~を見てくれないっぽい。

~はだめ 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…

恥ずかしながら、golangの多値を返す関数の戻り値を引数に渡した場合の挙動を把握していなかった

はじめに 通常の言語だと、多値とdestructuring(分配束縛)は別物で、単一の構造体をバラす構文が入っているという感じのことが多い(schemaなどではそれとは全く別に多値を返す事ができるけれど。一方でbindingのための構文が別途用意されている)。例えばpyth…

はてなブログの記事をアップロードするコマンドを作った

github.com hatenaはoauth1.0aっぽいのでわりとだるかった。 インストール $ go get github.com/podhmo/hatena/cmd/hatena 使い方 新規投稿と編集を手軽にやりたかった。投稿した時点でaliasを覚えてくれるので編集が楽。 # 新規投稿 $ hatena -alias foo fo…

packageを指定してのgoコードの生成に対するgofmt(goimports)について

github.com おそらくニッチな話になってしまっているけれど。メモ。 はじめに goawayを使ってコード生成をしたときの典型的なコードの利用方法は以下の様な形になる。 $ python myscript.py --package=github.com/podhmo/myscript --position=. # 実際にGOPA…

もうちょっと複雑なpythonでgoのコードを生成する例(わりとよい)

github.com もうちょっと複雑なpythonでgoのコードを生成する例を紹介して見ることにした。具体的にはswagger specを見てgoのstructを生成する処理。 go-swaggerなどswagger specからgoのコードを生成するツールは既にあったりはするのだけれど。これと似た…

pythonでgoを書くためのライブラリを作り始めました

github.com pythonでgoを書くためのユーティリティ的なライブラリを作り始めました。良い名前が見つかったので進捗がありました。 できること できることは少しずつ増えていく予定です。 structの定義 例えば、以下の様な感じでstructを定義できます。 from …

テキトウな設定ファイル(yaml,json)から、swagger specを生成して、goのstructを定義してloadしてみる

github.com テキトウな設定ファイル(yaml,json)から、swagger specを生成して、goのstructを定義してloadしてみることにしてみた。 生成されるswagger specとgoのstruct定義は雛形っぽい感じであんまり真面目に作っていない。とりあえず雰囲気だけでも分かる…

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…