golang bad file descriptor问题的解决方法

发现问题

在golang中,对文件进行写操作时出现上面的错误。首先复现下这个问题。

package main

import (
 "os"
 "fmt"
)

func main() {
 file, err := os.Open("a.txt")
 if err != nil {
  fmt.Println(err)
 }
 defer file.Close()

 content:=[]byte("Go is an open source programing language that makes it easy to build simple,reliable,and efficient software")
 _, err = file.Write(content)
 if err != nil {
  fmt.Println(err)
 }
}

此时运行就会出现错误write a.txt: bad file descriptor。这是什么原因呢?其实这和os.Open()函数有关,下面了解下Open()函数。

func Open(name string) (*File,error) {
 return OpenFile(name, O_RDONLY, 0)
}

可以看出来,Open函数打开文件的默认方式是只读,所以当你要对打开的文件进行写操作时,是不被允许的。OpenFile函数的第二个传入参数的值可以是:

参数名 含义
O_RDONLY 打开只读文件
O_WRONLY 打开只写文件
O_RDWR 打开既可以读取又可以写入文件
O_APPEND 写入文件时将数据追加到文件尾部
O_CREATE 如果文件不存在,则创建一个新的文件
O_EXCL 文件必须不存在,然后会创建一个新的文件
O_SYNC 打开同步I/0
O_TRUNC 文件打开时可以截断

解决方法

现在知道原因,解决方法只要改变文件读取的方式就行。如下例:

package main

import (
 "os"
 "fmt"
)

func main() {
 file, err := os.OpenFile("a.txt", os.O_APPEND|os.O_WRONLY, os.ModeAppend)
 if err != nil {
  fmt.Println(err)
 }
 defer file.Close()

 content:=[]byte("Go is an open source programing language that makes it easy to build simple,reliable,and efficient software")
 _, err = file.Write(content)
 if err != nil {
  fmt.Println(err)
 }
}

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • Golang报“import cycle not allowed”错误的2种解决方法

    前言 相信不少 Gopher 在写 Golang 程序都遇到过 import cycle not allowed 问题,本人最近研读 go-ethereum 源码时,发现定义 interface 也能解决此问题, 还能解决连分包都不能解决的情况, 并且比分包更加简单快捷.下面逐个讲解 分包 和 定义接口 这两种方法. 1. 应用场景 假设有如下使用场景: A 是应用程序的框架级结构体,在 A 包含子模块 B 和 C 的指针: B 为了方便的使用应用的其他子模块(比如 C )功能,所以在其结构体包

  • Go语言中更优雅的错误处理

    从现状谈起 Go语言受到诟病最多的一项就是其错误处理机制.如果显式地检查和处理每个error,这恐怕的确会让人望而却步.下面我们将给大家介绍Go语言中如何更优雅的错误处理. Golang 中的错误处理原则,开发者曾经之前专门发布了几篇文章( Error handling and Go和 Defer, Panic, and Recover.Errors are values )介绍.分别介绍了 Golang 中处理一般预知到的错误与遇到崩溃时的错误处理机制. 一般情况下,我们还是以官方博客中的错误

  • GO语言标准错误处理机制error用法实例

    本文实例讲述了GO语言标准错误处理机制error用法.分享给大家供大家参考.具体分析如下: 在 Golang 中,错误处理机制一般是函数返回时使用的,是对外的接口,而异常处理机制 panic-recover 一般用在函数内部. error 类型介绍 error 类型实际上是抽象了 Error() 方法的 error 接口,Golang 使用该接口进行标准的错误处理. 复制代码 代码如下: type error interface {  Error() string } 一般情况下,如果函数需要返

  • golang新手们容易犯的3个错误总结

    前言 从golang小白到成为golang工程师快两个月了,我要分享一下新手在开发中常犯的错误,都是我亲自踩过的坑.这些错误中有些会导致无法通过编译,这种错容易发现,而有些错误在编译时不会抛出,甚至在运行时也不会panic,如果缺少相关的知识,挠破头皮都搞不清楚bug出在哪. 1.对nil map.nil slice 添加数据 请考虑一下这段代码是否有错,然后运行一遍: package main func main() { var m map[string]string m["name"

  • Go语言中错误处理实例分析

    本文实例讲述了Go语言中错误处理的方法.分享给大家供大家参考.具体分析如下: 错误是可以用字符串描述自己的任何东西. 主要思路是由预定义的内建接口类型 error,和其返回返回字符串窜的方法 Error 构成. type error interface { Error() string } 当用 fmt 包的多种不同的打印函数输出一个 error 时,会自动的调用该方法. 复制代码 代码如下: package main import (     "fmt"     "time

  • golang bad file descriptor问题的解决方法

    发现问题 在golang中,对文件进行写操作时出现上面的错误.首先复现下这个问题. package main import ( "os" "fmt" ) func main() { file, err := os.Open("a.txt") if err != nil { fmt.Println(err) } defer file.Close() content:=[]byte("Go is an open source program

  • Laravel执行migrate命令提示:No such file or directory的解决方法

    本文实例讲述了Laravel执行migrate命令提示:No such file or directory的解决方法.分享给大家供大家参考,具体如下: 今天使用Laravel命令行工具操作数据库迁移操作时报错,提示mysql 2002错误,如图: 查看数据库配置没错呀,网站前台也可以打开,说明能连上,那是什么原因呢? 在Laravel5中,有两种办法解决: 1.增加一个数据库配置项 'mysql' => [ 'driver' => 'mysql', 'host' => env('DB_H

  • gorm golang 并发连接数据库报错的解决方法

    底层报错 error:cannot assign requested address 原因 并发场景下 client 频繁请求端口建立tcp连接导致端口被耗尽 解决方案 root执行即可 sysctl -w net.ipv4.tcp_timestamps=1 开启对于TCP时间戳的支持,若该项设置为0,则下面一项设置不起作用 sysctl -w net.ipv4.tcp_tw_recycle=1 表示开启TCP连接中TIME-WAIT sockets的快速回收 以上这篇gorm golang 并

  • 64位linux 编译c提示gnu/stubs-32.h:No such file or directory的解决方法

    64位linux提示gnu/stubs-32.h:No such file or directory的解决方法 这个问题是由于缺少32位兼容包,解决办法: ubuntu: sudo apt-get install libc6-dev-i386 CentOS:yum -y install glibc-devel.i686 Re阿里云yum源没有glibc.i686 阿里云的64位Linux发行版屏蔽了32位,也就是常见的i686软件包的数据源,你可以修改yum的配置文件/etc/yum.conf,

  • Linux执行可执行文件提示No such file or directory的解决方法

    最近在使用Linux操作系统执行一个可执行文件,结果出现了No such file or directory的提示,表示很疑惑. ./tshrf bash: ./tshref: No such file or directory 查看文件信息,可以看到文件是存在的,并且是可以执行的. -rwxr-xr-x 1 yuan yuan 20581 4月 29 2004 tshref 查阅资料后,原因是系统位数与该可执行文件需要的lib库位数不匹配. 用uname命令打印系统信息,发现系统是64位系统

  • python错误提示:Errno 2] No such file or directory的解决方法

    目录 1.问题描述: 2.解决方法: 3.小结: 总结 1.问题描述: 在学习北京大学曹健老师的tensorflow2.0笔记的时候,遇到了 [Errno 2] No such file or directory: './mnist_image_label/mnist_train_jpg_60000.txt' 这个没有查找到子文件或者子文件夹的问题. 2.解决方法: 首先,确定所写的路径中包含相应的文件夹或者文件. 其次,如果文件名字或者路径没写错,查看自己是否使用相对路径(绝对路径一般不会报错

  • IIS下Zend 出现 Unable to view file mapping 问题的解决方法汇总

    zend 错误日志中有:Unable to view file mapping, 试图访问无效的地址.网上搜了下解决方法有 解决方法如下: 对比php两个版本的php.ini文件. ;extension=php_yaz.dll;extension=php_zip.dll检查这个两个是否存在新的版本中.同时确认extension=php_zip.dll前面的;去掉保存重启iis和mysql 大功告成 另外一种说法 eAccelerator v0.9.4-rc1, 这个php加速插件,把这个屏蔽掉就

  • 详解no input file specified 三种解决方法

    一.IIS Noinput file specified 方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS 方法二: 请修改php.ini 找到 ; cgi.force_redirect = 1 去掉前面分号,把后面的1改为0 即 cgi.force_redirect = 0 二.apache  No input file specified apache No input filespecified,今天是我们配置apache RewriteRule时出

  • golang struct扩展函数参数命名警告解决方法

    今天在使用VSCode编写golang代码时,定义一个struct,扩展几个方法,如下: package storage import ( "fmt" "github.com/zsy619/gcommon" ) //ChunkFooter 块Footer type ChunkFooter struct { ChunkDataTotalSize int } //NewChunkFooter 创建一个ChunkFooter func NewChunkFooter(chu

  • POI导出Excel报错No such file or directory的解决方法

    场景重现 Apache POI Linux Tomcat 如上所示,当时在linux+tomcat的环境下,使用apache的poi导出excel的时候就会报"No such file or directory"的错误. 错误信息 java.lang.RuntimeException: java.io.IOException: No such file or directory at org.apache.poi.xssf.streaming.SXSSFWorkbook.createA

随机推荐