errors.Is checks whether a wrapped error chain contains a specific sentinel.

errors is Use `errors.Is` when callers need to ask whether a known error occurred under extra context.

Errors Is

key
errors_is.go
Replay: real traced execution (multi-file project)
package main

import (
	"errors"
	"fmt"
)

var ErrMissing = errors.New("missing record")

func lookup(key string) error {
	if key == "missing" {
		return fmt.Errorf("lookup %s: %w", key, ErrMissing)
	}
	return nil
}

func main() {
	var key = "missing"
	err := lookup(key)
	errText := "none"
	if err != nil {
		errText = err.Error()
	}
	isMissing := errors.Is(err, ErrMissing)

	fmt.Println("key=", key)
	fmt.Println("err=", errText)
	fmt.Println("is_missing=", isMissing)
}
package main

import (
	"errors"
	"fmt"
)

var ErrMissing = errors.New("missing record")

func lookup(key string) error {
	if key == "missing" {
		return fmt.Errorf("lookup %s: %w", key, ErrMissing)
	}
	return nil
}

func main() {
	var key = "ok"
	err := lookup(key)
	errText := "none"
	if err != nil {
		errText = err.Error()
	}
	isMissing := errors.Is(err, ErrMissing)

	fmt.Println("key=", key)
	fmt.Println("err=", errText)
	fmt.Println("is_missing=", isMissing)
}
  1. key ← "missing"

    17func main() {18  var key→ "missing" = "missing" //@key="ok", "missing"19  err := lookup(key"missing")20  errText := "none"
  2. func lookup(key string) error

    10func lookup(key"missing" string) error {11  if key == "missing" {
  3. if key == "missing"

    10func lookup(key string) error {11  if key"missing" == "missing" {12    return fmt.Errorf("lookup %s: %w", key"missing", ErrMissing&errors.errorString{s:"missing record"})13  }
  4. err ← &fmt.wrapError{msg:"lookup missing: missing record", err:(*errors.errorString)(⟨addr A⟩)}

    18var key = "missing" //@key="ok", "missing"19err→ &fmt.wrapError{msg:"lookup missing: missing record", err:(*errors.errorString)(⟨addr A⟩)} := lookup(key"missing")20errText→ "none" := "none"21if err != nil {
  5. errText ← "lookup missing: missing record"

    20errText := "none"21if err&fmt.wrapError{msg:"lookup missing: missing record", err:(*errors.errorString)(⟨addr A⟩)} != nil {22  errText→ "lookup missing: missing record" = err&fmt.wrapError{msg:"lookup missing: missing record", err:(*errors.errorString)(⟨addr A⟩)}.Error()23}
  6. isMissing ← true

    23  }24  isMissing→ true := errors.Is(err&fmt.wrapError{msg:"lookup missing: missing record", err:(*errors.errorString)(⟨addr A⟩)}, ErrMissing&errors.errorString{s:"missing record"})2526  fmt.Println("key=", key"missing")27  fmt.Println("err=", errText"lookup missing: missing record")28  fmt.Println("is_missing=", isMissingtrue)29}
    outputkey= missing
    err= lookup missing: missing record
    is_missing= true
  1. key ← "ok"

    17func main() {18  var key→ "ok" = "ok"19  err := lookup(key"ok")20  errText := "none"
  2. func lookup(key string) error

    10func lookup(key"ok" string) error {11  if key == "missing" {12    return fmt.Errorf("lookup %s: %w", key, ErrMissing)13  }14  return nil15}
  3. err ← <nil>, errText ← "none", isMissing ← false

    18  var key = "ok"19  err→ <nil> := lookup(key"ok")20  errText→ "none" := "none"21  if err != nil {22    errText = err.Error()23  }24  isMissing→ false := errors.Is(err<nil>, ErrMissing&errors.errorString{s:"missing record"})2526  fmt.Println("key=", key"ok")27  fmt.Println("err=", errText"none")28  fmt.Println("is_missing=", isMissingfalse)29}
    outputkey= ok
    err= none
    is_missing= false