0Pricing
Go Academy · レッスン

errorインターフェース

Goらしいエラーの返却とチェック

「errorインターフェース」はCoddyKit上の無料Go Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはGo Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Go Academyコースには全4レッスンが含まれています。

Go のエラーに対する考え方

Go では、例外ではなく値としてエラーを扱います。関数は最後の戻り値として error を返します。呼び出し側はそれを明示的にチェックする必要があります:

package main
import ("fmt"; "strconv")

func main() {
    n, err := strconv.Atoi("abc")
    if err != nil {
        fmt.Println("error:", err)  // handle it
        return
    }
    fmt.Println(n)
}

error インターフェース

組み込みの error は、単純なインターフェースです:

// Built into Go — no import needed
type error interface {
    Error() string
}

// Any type with Error() string satisfies it
// nil means no error

エラーを返す

失敗する可能性がある関数は (value, error) を返します。エラーがない場合は nil を返します:

package main
import ("fmt"; "errors")

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("division by zero")
    }
    return a / b, nil
}

func main() {
    result, err := divide(10, 0)
    if err != nil {
        fmt.Println("error:", err)
        return
    }
    fmt.Println(result)
}

if err != nil パターン

if err != nil によるチェックは、Go で最も一般的なイディオムです。エラーは必ず処理し、無視しないでください:

package main
import ("fmt"; "os")

func main() {
    f, err := os.Open("config.json")
    if err != nil {
        fmt.Println("open error:", err)
        return
    }
    defer f.Close()
    // use f...
    _ = f
}

errors.New — 単純なエラー値

errors.New は、固定メッセージを持つ単純なエラーを作成します:

package main
import ("fmt"; "errors")

var ErrNotFound = errors.New("not found")

func findByID(id int) (string, error) {
    data := map[int]string{1: "Alice"}
    v, ok := data[id]
    if !ok {
        return "", ErrNotFound
    }
    return v, nil
}

func main() {
    _, err := findByID(99)
    fmt.Println(err) // not found
}

fmt.Errorf — 書式付きエラーメッセージ

fmt.Errorf は、書式付き文字列からコンテキストを含むエラーを作成します:

package main
import "fmt"

func openConfig(path string) error {
    // Add context to the error message
    return fmt.Errorf("openConfig %s: file not found", path)
}

func main() {
    err := openConfig("/etc/app/config.yaml")
    fmt.Println(err)
    // openConfig /etc/app/config.yaml: file not found
}

センチネルエラー

センチネルエラーは、同一性の比較に使用するパッケージレベルのエラー値です:

package main
import ("fmt"; "errors")

var (
    ErrTimeout    = errors.New("timeout")
    ErrPermission = errors.New("permission denied")
)

func doRequest() error { return ErrTimeout }

func main() {
    err := doRequest()
    if errors.Is(err, ErrTimeout) {
        fmt.Println("request timed out — retrying")
    }
}

エラーを無視するのはバグです

Go では、宣言したすべての変数を使用する必要があります。ただし、_ でエラーを無視してもコンパイルは通るため、よくある避けるべきミスです:

package main
import "os"

func bad() {
    os.Remove("temp.txt") // silently ignores error — bad practice
}

func good() error {
    if err := os.Remove("temp.txt"); err != nil {
        return err  // propagate
    }
    return nil
}

エラーコンテキスト:情報を追加する

エラーを呼び出しスタックの上位へ伝播するときは、どの操作が失敗したかを説明するコンテキストを追加します:

package main
import "fmt"

func readConfig(path string) ([]byte, error) {
    return nil, fmt.Errorf("readConfig: %w", fmt.Errorf("file %s not found", path))
}

func setup() error {
    _, err := readConfig("/etc/app.cfg")
    if err != nil {
        return fmt.Errorf("setup: %w", err) // wrap with context
    }
    return nil
}

func main() {
    err := setup()
    fmt.Println(err) // setup: readConfig: file /etc/app.cfg not found
}

複数のエラー戻り値

関数は複数の失敗箇所からエラーを返すことがあります。それぞれをチェックしてください:

package main
import ("fmt"; "strconv")

func parseRange(minStr, maxStr string) (int, int, error) {
    min, err := strconv.Atoi(minStr)
    if err != nil { return 0, 0, fmt.Errorf("min: %w", err) }
    max, err := strconv.Atoi(maxStr)
    if err != nil { return 0, 0, fmt.Errorf("max: %w", err) }
    if min > max { return 0, 0, fmt.Errorf("min %d > max %d", min, max) }
    return min, max, nil
}

func main() {
    lo, hi, err := parseRange("1", "10")
    if err != nil { fmt.Println(err); return }
    fmt.Println(lo, hi)
}

確認問題

Go で nil のエラー戻り値は何を示しますか?

まとめ:error インターフェース

エラー処理の重要な概念:

  • error は組み込みインターフェースです:Error() string
  • (value, error) を返します — nil は成功を意味します
  • 単純なエラーには errors.New、書式付きエラーには fmt.Errorf を使用します
  • 常に if err != nil をチェックします
  • エラーをスタックの上位へ伝播するときはコンテキストを追加します
  • エラーを決して黙って無視しません

よくある質問

「errorインターフェース」レッスンは無料ですか?

はい。「errorインターフェース」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Go Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Go Academyコースには全4レッスンが含まれています。

「errorインターフェース」で何を学びますか?

Goらしいエラーの返却とチェック ブラウザで直接実行するハンズオンコードでGo Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Go Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのGo Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「errorインターフェース」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このGo Academyレッスンでコードを書いて実行できますか?

はい。すべてのGo Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. errorインターフェース
  2. カスタムエラーの作成
  3. エラーのラップとアンラップ
  4. panic、recover、defer
← Go Academyに戻る