見出し画像

GO言語のsync.Mapの挙動に悩む

浦和レッズ 引き分け!
キャンプでリアルタイムの観ていなかった土曜日の試合は大勝だったのに…

今朝は4時半から開発開始です。昨日に続いてWails v3を試す予定でしたが、昨日見つけたsync.Mapのオカシナ動作が気になって早く目が覚めてしまいました。

です。Range関数を使って登録してあるものから目的のものを探す処理で
まさかのキーが変な値になっている問題に遭遇しました。

m := sync.Map{}
 
// 値の格納
m.Store("Key 1", "Value 1")
m.Store("Key 2", "Value 2")
 
m.Range(func(key interface{}, value interface{}) bool {
	fmt.Printf("Key: %v -> Value: %v\n", key, value)
	return true
})

のような処理で、Keyの値がKey 1やKey 2ではないものが現れるという不可思議な現象です。値のほうは、ちゃんとした値なのです。キーが変わっているのかと思いましたが、そうではないのです。読み出している処理の場所によって発生するので厄介です。Fiberという Webフレームワークとの組み合わせで発生しています。さらに、sync.Mapに入れている中身が特殊なものだけ発生しています。違うデータを管理するsync.Mapでは発生しないのです。

調べていると助手の猫が天から「プログラマー探偵の出番では?」と言ってきました。3時間近く調べましたが自分が作った部分の修正では解決できないことがわかりました。原因究明は諦めることにしました。

ソースコードを読んでいてデータの持ち方をもう少し良い方法にできそうだと思いました。そちらに変えて試してみようと思いますが、今朝は、時間切れです。

明日に続く


開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。