golang zero memory allocation slice filtering 次のように、あるスライスをフィルタリングする関数を書くことがあると思います。 func FilterFoo(arr []string) []string { b := []string{} for _, e := range arr { if IsFoo(e) { b = append(b, e) } } return b } 簡単なベンチマークを書くとわかるように、この関数は返値となるスライスの長さ+1回のメモリアロケーションを行います。一般に、メモリアロケーションの回数は少ない方がパフォーマンスがよく、可能ならばアロケーション回数0を目指したいものです。 今回の場合、次のように書くとメモリアロケーション回数0回の関数を書くことができます。 nasa9084 4 2月 2019 • 2 min read
golang array/sliceに対する存在確認関数のベンチマーク Pythonでいうところの、次の様な条件式を実現する関数を書きたかった。 ls = ["foo", "bar", "baz"] s = "baz" if s in ls: print("FOOBAR!") 対象がリストの時、普段なら普通にfor文を回すのですが、今回やりたかったのは定数値の一覧にあるかどうか、だったのと、定数の数も少なかったので、とりあえずで以下の様に実装していました。 nasa9084 26 6月 2018 • 2 min read
golang Golang: 配列からスライスに変換する TL;DR: slice := array[:]で変換できる Go言語にはリストの様なものが二つあります。配列(固定長)とスライス(可変長)です。 一般に、Go言語で配列を扱うことは多くないでしょう。 実際、多くのパッケージ(標準パッケージを含む)が要求するのはスライスです。 とは言っても一部のパッケージでは配列を取り扱っているものがあります。 例えば、crypto/sha512を見てみると、以下の様な関数が存在します。 func Sum512(data []byte) [Size]byte ここで、Sizeは同パッケージ内で宣言されている定数で、 nasa9084 16 3月 2018 • 2 min read