読者です 読者をやめる 読者になる 読者になる

Go で cannot assign to xxx のエラー

golang

ググると色々情報があるが、
日本語の情報がないので書いておく。

https://play.golang.org/p/atdCt2Mken

これを実行すると「cannot assign to struct field users[0].Connected in map」のエラーが出る。

結論から言うと map が問題らしい。

go - Why do I get a "cannot assign" error when setting value to a struct as a value in a map? - Stack Overflow

ここに答えっぽいのが書いてあるけど、
正直良くわからなくて、
map はアドレス指定できないもので、
実行中にそれを指定して参照しようとすると、このエラーが出るっぽい。
https://golang.org/ref/spec#Address_operators
http://golang.jp/go_spec#Address_operators

以下の記事でも map の値が移動するような記述がある
http://wazanova.jp/items/856

新しいbucket配列のメモリが利用可能になると、古いbucket配列のkey/valueペアは新しいbucket配列に移動("evacuated" = 避難)する。key/valueペアが追加もしくは削除されるタイミングで、移動は起きる。古いbucketで同じ場所にあったkey/valueペアは、別々の新しいbucketに移る可能性がある。key/valueペアを均等に配置しようというアルゴリズムが働くからである。


最初に提示した以下の場合は・・・
https://play.golang.org/p/atdCt2Mken

以下のようにするとエラーにならない。
https://play.golang.org/p/8OEZ-hKN9G

map で key 指定した struct ごと変更してあげれば大丈夫っぽい。
map の参照がアドレス指定できない場合はエラーになるようなので、
今回のように対象が struct 以外の場合でも(string などでも)エラーになる。

twitter にてポインタにするとエラーにならないとのメッセージをいただきました。

たしかにエラーにならないですね。
自分は基本ポインタ使うので、遭遇しなかったのかな。
https://play.golang.org/p/3aflz7y1ku


これ詳しく分かる人、コメント or twitter で教えていただけると助かります・・・。