gpt4 book ai didi

go - Go 的 os.OpenFile 标志参数中管道字符的用途是什么?

转载 作者:IT王子 更新时间:2023-10-29 01:36:06 26 4
gpt4 key购买 nike

在Go的os包中使用OpenFile函数时,管道字符的作用到底是什么?

例子:

os.OpenFile("foo.txt", os.O_RDWR|os.O_APPEND, 0660)

它是否用作逻辑OR?如果是这样,Go 会选择第一个“真实”的吗?作为这些标志代表的常量,它们的核心只是用十六进制编写的整数,编译时 Go 如何选择应用哪个标志?

毕竟,如果函数调用的次数最多,os.O_APPEND 将优先于传入的所有其他标志,如下所示:

os.O_RDWR == syscall.O_RDWR == 0x2 == 2
os.O_APPEND == syscall.O_APPEND == 0x400 == 1024
os.O_CREATE == syscall.O_CREAT == 0x40 == 64

更新 1

要跟进下面的评论,如果我使用 os.O_APPEND|os.O_CREATE 进行按位运算符计算,如果文件存在,是否会出现错误,或者只是根据需要创建/追加?

更新 2

我的问题有两个方面,一个是理解按位运算符的目的,我现在知道它更多地被用作位掩码操作;第二,如何使用 os.OpenFile() 函数作为创建或追加操作。在我的游戏中,我发现以下组合最有效:

file, _ := os.OpenFile("foo.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0660)
file.WriteString("Hello World\n")
file.Sync()

这是正确的方法还是有更简洁的方法?

最佳答案

它是按位,而不是逻辑或。

如果您以二进制形式写出数字,并为每个数字分配一个真值 0/1,并对参数之间位置 i 中的每个位应用逻辑或,然后重新组合通过二进制扩展将结果转换为整数 - 这就是 | 运算符。

它通常以通常被描述为“位掩码”的方式使用 - 当您希望单个 int 值表示一组(小)可以打开或关闭的开关时,您可以使用位掩码。每个开关一位。

你应该在这个上下文中看到,A | B 表示“A 中所有打开的开关,以及 B 中所有打开的开关”。在您的情况下,开关定义了文件打开/创建功能的确切行为,如 the Go manual 所述。 . (我上面链接的 Unix 联机帮助页可能更详细)。

在位掩码中,通常定义代表每个开关的常量 - 这就是确定这些 O_* 常量的方式。每个都是一个只有一个位设置的 int,代表一个特定的开关。 (不过,要小心,因为有时它们代表开关的组合!)。

还有:

 ^A  // All of the "switches" not currently on in A
A&^B // All of the "switches" on in A but not on in B
A^B // All of the "switches" on in exactly one of A or B

运算符 | 本身在 Go 手册中有描述 here .

关于go - Go 的 os.OpenFile 标志参数中管道字符的用途是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37009406/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com