err := fmt.Errorf("wrap: %w", os.ErrNotExist); errors.Is(err, os.ErrNotExist)?Вернёт true. Глагол %w в fmt.Errorf оборачивает os.ErrNotExist, сохраняя связь. errors.Is рекурсивно разворачивает цепочку и сравнивает с целевой ошибкой.
err := fmt.Errorf("wrap: %w", os.ErrNotExist)
err == os.ErrNotExist // false - err это другая обёртка
errors.Is(err, os.ErrNotExist) // true
errors.Is вызывает Unwrap() у обёртки и проверяет внутреннюю ошибку. Так можно надёжно сравнивать с sentinel-ошибками даже через несколько уровней обёрток.