Goで「配列のスライス」を「スライスのスライス」に変換する時は少し注意が必要
久しぶりにGoでハマった。下記のようなコードで。
The Go Playground
チェーン業界外の人のために注釈を付けておくと、本コードのcommon.Hash
はtype Hash [32]byte
で定義されている配列です。
ループ変数(の一部)が配列である時に、これをスライシングするとループ変数を指すスライスが出来てしまい、期待とは違った動作になる、というお話。
じゃあなぜBytes()
を使うと回避できるのかというと、こいつは値レシーバなのでループ変数のコピーをスライシングする形になるからです。
ただの便利メソッドじゃなかったのね...必ず使うようにします。
追記: ていうか、下記のやつの派生パターンに過ぎないのか。