0

0

Go 中如何正确判断 write 操作因磁盘空间不足(ENOSPC)而失败

碧海醫心

碧海醫心

发布时间:2026-01-20 14:24:37

|

208人浏览过

|

来源于php中文网

原创

Go 中如何正确判断 write 操作因磁盘空间不足(ENOSPC)而失败

go 中,`os.write` 返回的错误通常是 `*os.patherror` 类型,其 `err` 字段封装了底层系统调用的 errno(如 `syscall.enospc`),需通过类型断言提取并比对,而非直接断言为 `syscall.errno`。

Go 的 I/O 错误设计遵循分层封装原则:当 os.File.Write 失败时,标准库返回的是 *os.PathError(实现了 error 接口),它不仅包含操作名(如 "write")和路径(如 "dump.txt"),还通过 Err 字段保存原始系统错误(例如 syscall.ENOSPC)。因此,不能直接对 err 做 err.(syscall.Errno) 断言——因为 PathError.Err 才是真正的 errno 类型值。

正确的做法是先断言为 *os.PathError,再检查其 Err 字段是否等于 syscall.ENOSPC。以下是修正后的完整示例:

Simplified
Simplified

AI写作、平面设计、编辑视频和发布内容。专为团队打造。

下载
package main

import (
    "log"
    "os"
    "syscall"
)

func main() {
    fd, err := os.Create("dump.txt")
    if err != nil {
        log.Fatal("failed to create file:", err)
    }
    defer fd.Close()

    for {
        buf := make([]byte, 1024)
        _, err := fd.Write(buf)
        if err != nil {
            log.Printf("Write error: %v", err)

            // 正确方式:断言为 *os.PathError,再检查其 Err 字段
            if pathErr, ok := err.(*os.PathError); ok {
                if pathErr.Err == syscall.ENOSPC {
                    log.Println("❌ Out of disk space! (ENOSPC)")
                    break
                }
                log.Printf("⚠️  Other system error: %v", pathErr.Err)
            } else {
                log.Printf("⚠️  Unexpected error type: %T", err)
            }
            break
        }
    }
}
✅ 关键点总结:os.PathError 是 Go 文件操作的标准错误包装器;pathErr.Err 是 syscall.Errno 类型(即底层 errno 值),可直接与 syscall.ENOSPC 等常量比较;直接对 err 断言 syscall.Errno 必然失败,因其实际类型是 *os.PathError;生产环境建议同时处理其他常见错误(如 syscall.EIO、syscall.EBADF),并添加重试或清理逻辑。

此外,注意避免忽略 os.Create 的初始错误(原代码中使用 _ 忽略),否则文件创建失败时程序会 panic。健壮的实现应始终校验打开/创建文件的返回值。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1468

2023.10.24

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

187

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

288

2023.10.25

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1025

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

66

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

451

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

10

2026.01.19

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

11

2026.01.19

微信聊天记录删除恢复导出教程汇总
微信聊天记录删除恢复导出教程汇总

本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

73

2026.01.18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.9万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号