Siburlog

SiblogだとSI BlogっぽいのでSiburlogとする

Goで「配列のスライス」を「スライスのスライス」に変換する時は少し注意が必要

久しぶりにGoでハマった。下記のようなコードで。
The Go Playground

チェーン業界外の人のために注釈を付けておくと、本コードのcommon.Hashtype Hash [32]byteで定義されている配列です。
ループ変数(の一部)が配列である時に、これをスライシングするとループ変数を指すスライスが出来てしまい、期待とは違った動作になる、というお話。

じゃあなぜBytes()を使うと回避できるのかというと、こいつは値レシーバなのでループ変数のコピーをスライシングする形になるからです。
ただの便利メソッドじゃなかったのね...必ず使うようにします。


追記: ていうか、下記のやつの派生パターンに過ぎないのか。

gist.github.com