MeWrite Docs

undefined: x

Goで定義されていない識別子を参照した際のコンパイルエラー

概要

Goで定義されていない変数、関数、型、パッケージなどの識別子を参照しようとした際に発生するコンパイルエラーです。

エラーメッセージ

undefined: myVariable
undefined: myFunction
undefined: fmt (if not imported)

原因

  1. 変数の未定義: 宣言前に変数を使用
  2. タイプミス: 識別子名のスペルミス
  3. インポート忘れ: パッケージをインポートしていない
  4. スコープの問題: 別のブロックで定義された変数を参照
  5. エクスポートされていない: 小文字で始まる識別子を別パッケージから参照

解決策

1. 変数を宣言

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// Bad
func main() {
    fmt.Println(message) // undefined: message
}

// Good
func main() {
    message := "Hello"
    fmt.Println(message)
}

2. パッケージをインポート

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// Bad
func main() {
    fmt.Println("Hello") // undefined: fmt
}

// Good
import "fmt"

func main() {
    fmt.Println("Hello")
}

3. スペルミスを修正

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// Bad
func calculateTotal() int {
    return 100
}

func main() {
    total := calulateTotal() // undefined: calulateTotal (タイプミス)
}

// Good
func main() {
    total := calculateTotal()
}

4. スコープを理解

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Bad
func main() {
    if true {
        message := "Hello"
    }
    fmt.Println(message) // undefined: message
}

// Good
func main() {
    var message string
    if true {
        message = "Hello"
    }
    fmt.Println(message)
}

// または
func main() {
    message := ""
    if true {
        message = "Hello"
    }
    fmt.Println(message)
}

5. エクスポートされた識別子を使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
// mypackage/user.go
package mypackage

type user struct { // 小文字: エクスポートされない
    name string
}

type User struct { // 大文字: エクスポートされる
    Name string
}

// main.go
import "mypackage"

func main() {
    // u := mypackage.user{} // undefined: mypackage.user
    u := mypackage.User{Name: "John"} // OK
}

6. init関数の順序

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
// Bad: 定義前に使用
var config = loadConfig() // undefined: loadConfig

func loadConfig() Config {
    return Config{}
}

// Good: 関数を先に定義するか、init()を使用
func loadConfig() Config {
    return Config{}
}

var config = loadConfig()

// または
var config Config

func init() {
    config = loadConfig()
}

7. ビルドタグの確認

1
2
3
4
5
6
7
//go:build linux
// +build linux

package main

// このファイルはLinuxでのみビルドされる
// 他のOSでは関数が未定義になる
1
2
# ビルドタグを確認してビルド
go build -tags=linux

8. モジュールの確認

1
2
3
4
5
6
7
8
# go.mod が存在するか確認
cat go.mod

# モジュールを初期化
go mod init myproject

# 依存関係を解決
go mod tidy

よくある間違い

  • :== を混同して既存変数を上書きせず新しいスコープで宣言
  • 別パッケージの小文字で始まる識別子にアクセスしようとする
  • 使用していないインポートがあるとコンパイルエラーになることを忘れる

関連エラー

参考リンク

Go の他のエラー

最終更新: 2025-12-13