用 fmt.errorf 的 %w 包装错误,再用 errors.as 读取原错误类型。判断哨兵错误时使用 errors.is。

包装 JSON 解码错误
将下面的代码保存为 main.go,然后运行 go run main.go。
package main
import (
"encoding/json"
"errors"
"fmt"
)
func parseAge(raw []byte) error {
var data struct{ Age int }
if err := json.Unmarshal(raw, &data); err != nil {
return fmt.Errorf("解析年龄: %w", err)
}
return nil
}
func main() {
err := parseAge([]byte(`{"Age":"old"}`))
var typeErr *json.UnmarshalTypeError
if errors.As(err, &typeErr) {
fmt.Println(typeErr.Field, typeErr.Value)
}
}
预期打印 Age string。
比较哨兵错误
可以在 main 内追加这一段。
missing := errors.New("missing token")
err2 := fmt.Errorf("检查请求: %w", missing)
fmt.Println(errors.Is(err2, missing))预期打印 true。
验证仅格式化时的区别
同样在 main 内追加以下对照。
err3 := fmt.Errorf("检查请求: %v", missing)
fmt.Println(errors.Is(err3, missing))
fmt.Println(err3.Error())错误文本仍包含 missing token,errors.Is 返回 false。

















