golang

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(分配束縛)は別物で、単一の構造体をバラす構文が入っているという感じのことが多い(schemeなどではそれとは全く別に多値を返す事ができるけれど。一方で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…

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 …