Error values in Go seem simple at first, but the interface driven approach makes it possible to express detailed information about failure, allowing errors to be handled much more gracefully than the naive approach (e.g. sprinkling fmt.Errorf or errors.New)