MENU

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

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

今回はgolangで「undefined:~」というエラーが出たときの原因と解決策について紹介していきます。

目次

golangで「undefined:~」というエラーが出た

golangで開発を行っていると「undefined:~」というエラーによく遭遇します。

このエラーの原因はこれ一つというわけでなく、色んなパターンがあります。ということで陥りやすい原因と対処法をそれぞれ紹介していきます。

「undefined:~」の原因と対処法

定義されていない変数を参照している

これは最もよく起こるケースかもしれません。定義していない変数を参照しようとしてエラーが発生します。

func main() {
	fmt.Println(a)
}

こちらのコードのようにaがまだ定義されていないにも関わらず、出力処理をしようとしてエラーとなります。

main.go:8:14: undefined: a

aが定義されていない旨のエラーメッセージが表示されます。

これについてはaを初期化してあげたり、値を入れて宣言することで解決します。

func main() {
	a := 100
	fmt.Println(a)
}

今回はaに100を入れることでaを定義してエラーを解消しました。この実行結果は100となります。

スコープ外の変数を参照している

こちらもうっかりしてよく起こるエラーです。

参照することのできないスコープ外の変数を参照しようとした際にも「undefined:~」というエラーが発生します。

例えば以下のfor文でforの中でしか変数iを使用することができませんが、forの外で変数iを出力しようとしてエラーが発生します。

func main() {
	for i := 0; i < 10; i++ {
		fmt.Println(10)
	}
	fmt.Println(i)
}

この実行結果は以下となります。

main.go:11:14: undefined: i

この場合は変数iをforのスコープ内で参照するか、forに入る前にあらかじめ変数iを定義してあげることで解決します。

まずは以下のようにforの中で変数iを参照するパターンです。

func main() {
	for i := 0; i < 10; i++ {
		fmt.Println(i)
	}
}

この実行結果は0 1 2 3 4 5 6 7 8 9となります。

次にforに入る前にあらかじめ変数iを定義する方法です。

func main() {
	var i int
	for i = 0; i < 10; i++ {
	}
	fmt.Println(i)
}

forに入る前にあらかじめ変数iを宣言しておくことでエラーを解消することができます。ちなみにこの実行結果は10となります。

起動時に関係するファイルを渡していない

次にGoのプログラムを起動しようとしたときにも「undefined:~」が発生するパターンです。

複数のgoファイルにコードを書き、最後に以下のコマンドで実行しようとするとエラーが発生して実行することができません。

go run main.go

この原因はgo runコマンドを実行する場合は引数にコードを書いたファイル全てを渡さなければコンパイル対象とならないためです。

例えば他にget.goというファイルを作っていれば、以下のように実行すれば起動するこができます。

go run main.go get.go

実際に開発に入ると、ファイルは2つや3つに留まらないため全てを記載して実行するのは面倒です。

その場合は以下のコマンドで全てのgoファイルをコンパイル対象とすることができます。

go run .

パッケージがインポートできていない

最後にパッケージをインポートできていないパターンについてです。

例えば以下のコードのようにgoの標準ライブラリであるfmtを使おうとしたときに、importに記載がなければエラーが発生します。

package main

import (

)

func main() {
	a := 100
	fmt.Println(a)
}

このコードを実行するとfmtを認識できていないため「undefined:~」のエラーが発生します。

main.go:9:2: undefined: fmt

これはimportにfmtなどのライブラリを記載することが解決します。

package main

import "fmt"

func main() {
	a := 100
	fmt.Println(a)
}

意外と忘れてしまうことがあるので、ライブラリを使う場合はimportを忘れないようにしましょう。

ちなみにこのコードの実行結果は100です。

golangをもっと詳しくなりたい方に

golang学習のために筆者が実際に受講したUdemy教材をまとめています。

あわせて読みたい
【入門】golangの学習におすすめのUdemy教材5選 これから業務でgolangを使うことになった方、これからgolangを使ってキャリアを歩んでいきたいという方でどのように学習していこうか悩んでいる方もいるかと思います。 ...

golang学習のために筆者が実際に読んでおすすめしたい本をまとめています。

あわせて読みたい
【入門】golangの学習におすすめの本/書籍7選 これから業務でgolangを使うことになった方、これからgolangを使ってキャリアを歩んでいきたいという方でどのように学習していこうか悩んでいる方もいるかと思います。 ...
タメになったらシェアお願いします!
  • URLをコピーしました!
  • URLをコピーしました!
目次