goroutineで実行されるクロージャー(closure)で予期せぬ値が出力される
2022年04月08日 13:15
goroutineで実行されるクロージャーをループ内で起動した際に予期せぬ値が出力されることがあります。
例えば下記のようなvalues
をループで展開、その中でgoroutineを起動して値を出力してみます。
原因は以下2つの理由です。
原因を1つ1つみていきます。
goroutineは起動に時間がかかります。上記コードにもtime.Sleep(time.Second)
があるのもgoroutineが起動する前にmain関数が終了するのを防ぐためです。
またfor分のvは同じ変数を参照しています。なのでgoroutineが起動する時には、ループが回り切っておりvにはスライスの最後の要素eriko
が格納されています。
上記2つを合わせるとgoroutineが起動する時には変数vにはスライスの最後の要素eriko
が入っており、クロージャー内のvではその値が参照されます。
2つの方法があります。
クロージャーの引数にvを渡すことで順番通りに変数にアクセスすることができます。
出力
変数の値をコピーして、新たな変数を作成することでクロージャーでも順番通りアクセスすることができます。
出力
診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。
目次を見る