为了账号安全,请及时绑定邮箱和手机立即绑定

Go 的 os.OpenFile 标志参数中管道字符的目的是什么?

Go 的 os.OpenFile 标志参数中管道字符的目的是什么?

Go
凤凰求蛊 2022-01-10 10:35:49
在使用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 == 2os.O_APPEND == syscall.O_APPEND == 0x400 == 1024os.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()这是正确的方法还是有更简洁的方法来做到这一点?
查看完整描述

2 回答

?
UYOU

TA贡献1878条经验 获得超4个赞

它是按位而不是逻辑或。


如果你写出来的二进制数字,并指定每个真值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

, 等等。


运营商|本身在围棋手册中描述这里


查看完整回答
反对 回复 2022-01-10
?
慕沐林林

TA贡献2016条经验 获得超9个赞

它是按位或运算符。此处使用它的目的是允许将多个值作为位掩码传递。因此,您可以组合标志来创建所需的结果,例如,OpenFile()如果文件不存在,则使用该函数创建文件,如果文件存在,则附加到该文件。

os.Openfile("foo.txt", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0660

从 os 包作为参数传递的常量是从 syscall 包中赋值的。这个包包含低级操作系统独立值。

包 syscall 包含一个到低级操作系统原语的接口。详细信息因底层系统而异,默认情况下,godoc 将显示当前系统的系统调用文档。如果您希望 godoc 显示另一个系统的系统调用文档,请将 $GOOS 和 $GOARCH 设置为所需的系统。例如,如果您想在 linux/amd64 上查看 freebsd/arm 的文档,请将 $GOOS 设置为 freebsd 并将 $GOARCH 设置为 arm。syscall 的主要用途是在为系统提供更便携接口的其他包中,例如“os”、“time”和“net”。

https://golang.org/pkg/syscall/

正如@BadZen 所指出的,按位或运算符,在这种情况下是“|” 字符,作用于二进制级别,将任何 0 值更改为尚未为 1 的 1。

您应该在这种情况下看到,A | B 的意思是“A 中所有打开的开关,以及 B 中所有打开的开关”。

通过像上面显示的那样执行此操作,您正在操纵函数的行为以创建os.O_CREATE具有给定名称的文件 ( )foo.txt或打开文件以进行读/写 ( os.O_RDWR),并且写入其中的任何值都将被附加 ( os.O_APPEND)。或者,您可以传递os.O_TRUNC以在写入之前截断文件。

按位 OR 运算符为您提供了一个强大的解决方案来组合不同的行为,以便从您想要的函数中获得结果。


查看完整回答
反对 回复 2022-01-10
  • 2 回答
  • 0 关注
  • 210 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信