golang 可能出现文件打开但是报错的情况吗

2023-06-10 10:45:37 +08:00
 Assassinrx
正常打开文件的模式代码就是这样,我想问下各位大佬可能出现 err 不为空但是文件被打开的情况吗

file, err := os.Open("filename.txt")
if err != nil {
// 处理错误
}
defer file.Close()

因为我想的是可能这么写更好些?

file, err := os.Open("filename.txt")
defer file.Close() // defer 写在 err 前面
if err != nil {
// 处理错误
}
1648 次点击
所在节点    Go 编程语言
27 条回复
flyqie
2023-06-11 00:00:27 +08:00
@Jirajine #16

没记错的话,io.EOF 是个例外。。

不过它不在 Open 而在 Read 用。
Jirajine
2023-06-11 00:47:27 +08:00
@flyqie 这个我当然知道,所以说这是 convention ,convention 有例外是很正常的。
像这种情况在其他类型严格且表达能力足够的语言中,接口可以返回一个专门的 IOResult ,与普通的 Result 区分。
timpaik
2023-06-11 01:12:32 +08:00
约定俗成,标准库里直接可以认为这俩互斥,但没有类型系统保证,第三方库保险起见看看实现就好了
realpg
2023-06-11 02:22:15 +08:00
golang 提供的官方标准库里,出现了你设想的那种场景,那就是 bug ,golang 官方负责解决,你下层不用想能解决上层的问题。

你引用了的别人的三方库里出现这种问题,那是哪个库作者的 bug ,库作者负责解决这种问题,你下层不用想能解决上层的问题。
Assassinrx
2023-06-12 13:47:56 +08:00
@timpaik ok ,了解
Assassinrx
2023-06-12 13:49:00 +08:00
@realpg 确实是这个道理
lotusgrm
2023-07-25 17:10:29 +08:00
os.Open Go 源码如下:
func Open(name string) (*File, error) {
return OpenFile(name, O_RDONLY, 0)
}

func OpenFile(name string, flag int, perm FileMode) (*File, error) {
testlog.Open(name)
f, err := openFileNolog(name, flag, perm)
if err != nil {
return nil, err
}
f.appendMode = flag&O_APPEND != 0

return f, nil
}

从这里可以看到,如果 open file 的时候,出现了 error ,os.Open 返回的第一个值是 nil, 那么此时也就不需要再进行 close

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/947492

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX