ogatasoが何か書きます

SWE(1年目)が勉強したことを書くヨ

Go言語のセンチネルエラーってなに?

初めてのGo言語を読んでいて、初めてみる「センチネルエラー」という単語に出会ったので、簡単に説明してみようと思います。

センチネルエラーとは、Goで時々見るエラーハンドリングのパターンの一つである(ちなみに、sentinelには見張りや衛兵といった意味があるらしい)。

単純にerr != nilでエラー判定するのではなく、err != zpi.ErrFormat のような比較をif文の条件にいれ、より具体的なエラーの種類を明示することで、特定エラーへの対応を行うことができる。

また、全てのセンチネルエラーはその変数の名前をErrから始める慣習がある。ただし、io.EOFは標準ライブラリの中では例外的にErrから始まらないセンチネルエラーである。

例えば、Goの標準ライブラリのarchive/apiではパッケージレベルで以下のようなエラーが定義されている。https://cs.opensource.google/go/go/+/refs/tags/go1.22.0:src/archive/zip/reader.go;l=27

var (
    ErrFormat       = errors.New("zip: not a valid zip file")
    ErrAlgorithm    = errors.New("zip: unsupported compression algorithm")
    ErrChecksum     = errors.New("zip: checksum error")
    ErrInsecurePath = errors.New("zip: insecure file path")
)

以下はその活用例(初めてのGo言語より)。

nonZipFile := bytes.NewReader(data)
_, err := zip.NewReader(nonZipFile, int64(len(data)))
if err == zip.ErrFormat {
    fmt.Println("ZIP形式ではありません")
}

こうしてみると、どのような種類のエラーが発生しうるのかが一目でわかってとても良さげ。というか、こういうのは他の言語でも似たようなものを見かけることはあるのでGo特有のエラーパターンではない気がする。

センチネルエラーのデメリットとして、柔軟性がなくなってしまうことが挙げられるため、その利用は必要最小限に抑えておくべきである。