package main import ( "errors" "fmt" ) // 定义自定义错误 var ( ErrFileNotFound = errors.New("file not found") ErrPermission = errors.New("permission denied") ) func main() { // 示例1: 直接错误比较 err := openFile("test.txt") // 使用 errors.Is 检查错误类型 if errors.Is(err, ErrFileNotFound) { fmt.Println("错误是: 文件未找到") } else if errors.Is(err, ErrPermission) { fmt.Println("错误是: 权限不足") } else { fmt.Printf("其他错误: %v\n", err) } // 示例2: 包装错误链 wrappedErr := fmt.Errorf("操作失败: %w", err) fmt.Printf("包装后的错误: %v\n", wrappedErr) // 即使错误被包装,errors.Is 仍然能识别 if errors.Is(wrappedErr, ErrFileNotFound) { fmt.Println("在包装错误链中找到了 ErrFileNotFound") } } func openFile(filename string) error { // 模拟文件操作错误 if filename == "missing.txt" { return ErrFileNotFound } if filename == "protected.txt" { return ErrPermission } return nil }