2023年5月7日日曜日

Goのrangeではメモリーを使い回している

最近ちょっとハマったところについてメモ。

要するにこういうことです。これを実行したらどうなると思いますか?おそらくfoo, bar, bazすべて同じ値になっていると思います。どんな値になるかは実行タイミングによって違うようです。

つまりrangeは各ループで毎回同じアドレスに値を入れているので、そのアドレスをあとで使おうと思っても想定外の値に変化していることがあります。

よく考えれば・・・というか考えなくても、「ループ内で毎回専用の領域を確保する」より「最初に領域を確保してループ内で使い回す」ほうが効率的なのは明らかなので、そういう仕様なのはまあ納得。

アドレスを後で使いたい場合は、一度別の変数にコピーして使いましょう

0 件のコメント:

コメントを投稿