Ode*_*Ode 2 filesystems flags pipe go bitwise-operators
在使用OpenFileGo的os包中的函数时,管道符到底有什么作用?
例子:
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
Run Code Online (Sandbox Code Playgroud)
为了跟进下面的评论,如果我有一个按位运算符计算,os.O_APPEND|os.O_CREATE如果文件存在,或者只是根据需要创建/附加,会出现该错误吗?
我的问题有两个,一是了解按位运算符的用途,我现在知道它更多地用作位掩码操作;二是了解按位运算符的用途。第二,如何使用该os.OpenFile()函数作为创建或追加操作。在我的尝试中,我发现以下组合效果最好:
file, _ := os.OpenFile("foo.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0660)
file.WriteString("Hello World\n")
file.Sync()
Run Code Online (Sandbox Code Playgroud)
这是正确的方法还是有更简洁的方法来做到这一点?
它是按位运算,而不是逻辑或运算。
如果您以二进制形式写出数字,并为每个数字分配真值 0/1,并对i参数之间的每个位应用逻辑或,然后通过二进制扩展将结果重新组装为整数 -这就是|运算符。
它通常以通常被描述为“位掩码”的方式使用 - 当您希望单个 int 值表示可以打开或关闭的一组(小)开关时,可以使用位掩码。每个开关一位。
您应该在上下文中看到,A | B意思是“A 中所有打开的开关,以及 B 中所有打开的开关”。在您的情况下,开关定义了文件打开/创建函数的确切行为,如Go 手册中所述。(也许我上面链接的 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
Run Code Online (Sandbox Code Playgroud)
, ETC。
操作符|本身在 Go 手册中进行了描述。
| 归档时间: |
|
| 查看次数: |
1212 次 |
| 最近记录: |