Humanity

Edit the world by your favorite way

Go

Go で struct をそのまま公開するのはあんまり良くないんじゃないか

と思った。理由は以下の通り。 ずっと地味に困ってた事があって、ある struct をコンストラクタ的な関数 (例えば Foo って struct だったら NewFoo って名前の関数) 経由で生成したい、と思っても、 Go の言語仕様上普通にこんな感じで struct を作れてしま…

panic() するか non-nil error が返ったらロールバック用の処理を実行するユーティリティ構造体 Guard を作った

Go

こんな感じに使う。 package main import ( "errors" "fmt" ) func main() { fmt.Println("start") if err := f(); err != nil { fmt.Println(err.Error()) } fmt.Println("end") } func f() (err error) { fmt.Println("f() start") g := &Guard{} defer fu…

Go の hashicorp/go-multierror 使ったら訳わからん挙動に遭遇してしまった

Go

基本的な Go の挙動が理解できてないのかもしれないですが、なぜ以下のコードで (2) err != nil: true となるのかが分かりません。 誰か教えて… (g() がメソッドなのはなるべく元のコードと似せたせいです) gist.github.com 追記 KoRoN さんとりんだんさんに…

AppVeyor で Go のバージョンを固定する方法

基本的に Go アプリのテストは以下を参考にしたら概ねうまく言ってたんだけど、 (最新じゃなく)バージョン固定してる場合に問題となったため書いておく。 blog.markvincze.com 起こった問題 最近 AppVeyor の Go のバージョンが上がって Go 1.10 をデフォ…

Go のオプション引数で -v -v -v みたいに複数指定する方法

Go

mattn さんに教えてもらった。 いつもお世話になってて感謝しかない。 -d dir1 -d dir2 みたいな引数を持つオプションを複数指定する方法 Go の flag パッケージで複数オプションをパースするにはどうしたらいいんだろ。-d dir1 -d dir2 で [dir1, dir2] の…

godoc.org と github.com のリポジトリを切り替えるブックマークレット作った

Go

godoc . org と github . com のリポジトリを切り替える雑なブックマークレット作ったhttps://t.co/VwKlEeWUqW— tyru (@_tyru_) 2017年9月17日 gist.github.com 以上です。

Go の net/http で Vue.js / Angular 1 などの HTML5 history mode に対応する

Go

type html5Handler struct { fs http.FileSystem routes []staticRoute } // Look up path when Vue.js HTML5 history mode is enabled // https://router.vuejs.org/ja/essentials/history-mode.html func enableHTML5Mode(fs http.FileSystem, routes []st…

Go のバージョンマネージャー gvm で gvm install したら「ERROR: Failed to compile」って言われた時

Go

github.com issue には上げたけど日本語でも書く。 結果から言うと自分が README.md よく読んでなかっただけ。 でも gvm ももうちょっと気を利かせてくれてもいいのになーと思ったので上の issue でお願いしたという経緯です。 解決法 Go 1.5 以上をコンパイ…

Go 言語の習作に watchevent ってファイルシステム監視するやつ作った

Go

習作って言っても以前 Go 触ってたことはありましたが、 そのツールを作ったこと自体忘れてたぐらい記憶が抜け落ちていたので、改めて Go に再入門しました。 作ったもの 使い方は README.md 読んでください(まだ不十分だと思いますが、分からない点は issu…

Go 言語の range は2番目の返り値に同じ参照を返す場合がある

Go

言葉で説明するのだるいので次のコードを見てください。 package main import ( "fmt" ) func main() { array := []int{1, 2, 3} // これだと &a が同じアドレスになってしまうことがある // (range は array[i] のコピーを返す) for i, a := range array { …