見出し画像

golangで「cannot assign to ~」というエラーが出たときの原因と対処法

今回は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をもっと詳しくなりたい方に

初めてのGo言語

Go言語の入門から応用まではこの一冊で網羅されています。説明も順序立てて説明されており完成度の高い参考書となっています。


詳解Go言語Webアプリケーション開発

こちらはGo言語の基礎知識を得たあとに読むことをすすめる本となっています。ハンズオン形式で手を動かしながら実装をしていくことができるため、実際の開発を意識しながらGo言語を学ぶことができます。

以下の記事では他にも筆者が実際に読んでおすすめしたい本をまとめています。


【Go入門】Golang基礎入門 + 各種ライブラリ + 簡単なTodoWebアプリケーション開発(Go言語)

まだGo言語の勉強を始めていない方、全くの初心者の方にはこちらのUdemy教材が最もおすすめです。

この教材ではgolangの基礎について網羅的に学ぶことができます。ただ見て学ぶだけでなく、講座の中でアプリ作成まで行うことで学んだことの理解をさらに深めることができます。


現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発

個人的に最も勉強になったのは「現役シリコンバレーエンジニアが教えるGo入門 + 応用でビットコインのシストレFintechアプリの開発」という教材です。
本格的なレクチャーに入る前に、なぜGoなのか、なぜFintechなのかについて説明されていることで、Goの概念や意味について大枠から理解することができます。

以下の記事では筆者が実際に受講したおすすめUdemy教材をまとめています。

※本ページではアフィリエイトリンク(PR)が含まれています


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?