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

ami_GS's diary

情報系大学院生の備忘録。ネットワークの勉強にハマっています。

go runでconstがundefinedする時

Golang

こんにちは、タイトルがメチャ適当な記事です。
年末でほんわかして時間があるので書きます。

はじめに

皆さんはGoのコードを動かすときに毎回ビルドしていますか?
自分はいつも以下のように動かしてしまいます。便利ですもんね。

$ go run something.go


今回は定数(const)を使用したプログラムが go run で次のエラーを出した時の対処法です。

$ go run something.go
$ ./something.go:10: undefined: AAA

次から書くコードは goDirというディレクトリにある事とします。

動く場合のコード

次のコードでは、定数の宣言とmain関数が同じファイルで書かれています。

code.go

package main

import "fmt"

const (
        AAA = 1
)

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

この時は、go runできちんと出力をしてくれます。

$ go run code.go
$ 1

動かない場合のコード

次のコードでは、定数の宣言とmain関数が別ファイルで書かれています。

code1.go

package main

import "fmt"

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

code2.go

package main

const (
    BBB = 1
)


この時、次のような出力が出てしまいます。定数の宣言がうまくいっていないようです。

$ go run code1.go
$ # command-line-arguments
$ ./code.go:6: undefined: BBB

なんでや!同じパッケージ名使ってるやろ!!

2つの解決法

書いてる時に2つ目があることに気づきました(驚愕)。

go runを使う場合
$ go run code1.go code2.go #順不同
$ 1

動きました!

go runを使わない場合

この場合、次のようにきちんとビルドしましょう。

$ go build
$ ./goDir
$ 1


動きました!
一応はコンパイルするタイプの言語なので、細かくビルドしてテストしていくのが適切なのかもしれませんね。

参考