猿问

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

在使用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

更新 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()

这是正确的方法还是有更简洁的方法来做到这一点?


凤凰求蛊
浏览 211回答 2
2回答

UYOU

它是按位而不是逻辑或。如果你写出来的二进制数字,并指定每个真值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, 等等。运营商|本身在围棋手册中描述这里。

慕沐林林

它是按位或运算符。此处使用它的目的是允许将多个值作为位掩码传递。因此,您可以组合标志来创建所需的结果,例如,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 运算符为您提供了一个强大的解决方案来组合不同的行为,以便从您想要的函数中获得结果。
随时随地看视频慕课网APP

相关分类

Go
我要回答