今回はgolangで「cannot assign to ~」というエラーが出たときの原因と解決策について紹介していきます。
golangで「cannot assign to ~」というエラーが出た
golangで開発を行っていると「cannot assign to ~」というエラーに遭遇します。
このエラーは代入することができないオブジェクトに対して代入しようとする際に起きるエラーです。
「cannot assign to ~」の原因と対処法
定数に再度代入しようとしている
簡単なところでいえば、constで定義している変数に対して新たに代入しようとするとエラーが発生します。
const a = 1
func main() {
a = 2
}
上記コードを実行すると、以下のエラーが発生します。
main.go:6:2: cannot assign to a (untyped int constant 1)
定数aには代入できないという旨のエラーメッセージが表示されます。
定数を変更したい場合は、定数を使用せずにグローバル変数のように変数を宣言することで、流動的に値を変更することができます。
var val = 1
func main() {
val = 2
}
mapに格納された構造体の要素に代入しようとしている
次にmapにstructを代入しようとすると発生するパターンです。mapにstructを入れることはできるのですが、structの要素に代入しようとするとエラーが発生します。
type xxxxxx struct {
text string
}
func main() {
a := make(map[int]xxxxxx)
a[0] = xxxxxx{text: "aaa"}
a[0].text = "bbb"
}
このコードを実行すると以下のエラーが発生します。
main.go:10:2: cannot assign to struct field a[0].text in map
これを解消するにはmapにstruct体の実体を入れるのではなく、structのポインターを格納する必要があります。
type xxxxxx struct {
text string
}
func main() {
a := make(map[int]*xxxxxx)
a[0] = &xxxxxx{text: "aaa"}
a[0].text = "bbb"
}
structをコピーして入れ替えるのでも解消はできますが、structが大きいとコピーのコストが高いためポインターを使うのが最適です。
文字列変数の個々の文字を更新しようとしている
変数に対してインデックス演算子を使用して、個々の文字を変更しようとするとエラーが発生します。
この原因は文字列は読み取り専用のバイトスライスであるため、文字列のまま変更することができません。
func main() {
a := "xxxxx"
a[0] = 'y'
fmt.Println(a)
}
上記コードを実行すると以下のエラーが発生します。
main.go:7:2: cannot assign to a[0] (value of type byte)
このエラーを解消するにはバイトスライスを使用する必要があります。
func main() {
a := "xxxxx"
abytes := []byte(a)
abytes[0] = 'y'
fmt.Println(string(abytes))
}
上記コードを実行した結果はyxxxxが出力されます。
golangをもっと詳しくなりたい方に
golang学習のために筆者が実際に受講したUdemy教材をまとめています。
golang学習のために筆者が実際に読んでおすすめしたい本をまとめています。