为什么Golang中可使用|符号传递多个值作为函数参数?
解答
os.OpenFile的第二个参数flag本质是位掩码类型的整数,设计上就是用来同时传递多个打开模式的,具体逻辑如下:
- Go标准库的
os包预先定义了一系列文件打开模式常量,这些常量本身都是合法的int类型值,每个常量对应二进制表示中独立的一位为1,分别控制不同的打开行为:os.O_APPEND:写入操作自动追加到文件末尾os.O_CREATE:如果目标文件不存在就自动创建os.O_WRONLY:以只写模式打开文件
- 代码中使用的
|是按位或运算符,由于每个模式常量对应的1所在的二进制位互不重叠,按位或运算之后得到的新int值会保留所有传入模式的标记,相当于同时选中多个打开模式。 OpenFile内部执行时会通过按位与运算逐位校验传入的flag值,判断哪些模式被启用,进而执行对应的文件打开逻辑。
举个简化的例子说明位运算的作用:假设os.O_WRONLY对应二进制0001、os.O_APPEND对应0010、os.O_CREATE对应0100,三个值做按位或运算后得到的结果是0111,函数内部把0111分别和三个常量做按位与运算,结果不为0就代表对应模式已开启。
内容的提问来源于stack exchange,提问作者akko
相关产品推荐
相关产品推荐

