gpt4 book ai didi

go - 如何解释 os.FileMode 的显示值?

转载 作者:行者123 更新时间:2023-12-01 20:23:21 24 4
gpt4 key购买 nike

我有一个程序试图过滤 NamedPipe 文件。由于它没有按预期工作,我打印了结果,但对输出结果感到惊讶。你能解释一下吗?

package main

import (
"io/ioutil"
"log"
"os"
)

func main() {
files, err := ioutil.ReadDir(".")
if err != nil {
log.Fatal(err)
}
for _, info := range files {
log.Printf("file: %s mode: %x\n", info.Name(), info.Mode()&os.ModeNamedPipe)
log.Printf("file: %s mode: %v\n", info.Name(), info.Mode()&os.ModeNamedPipe)
log.Printf("file: %s mode: %v\n", info.Name(), info.Mode()&os.ModeNamedPipe != 0)
}
}

这输出

2020/02/06 18:06:46 file: main.go mode: 2d2d2d2d2d2d2d2d2d2d
2020/02/06 18:06:46 file: main.go mode: ----------
2020/02/06 18:06:46 file: main.go mode: false
2020/02/06 18:06:46 file: status.kch mode: 702d2d2d2d2d2d2d2d2d
2020/02/06 18:06:46 file: status.kch mode: p---------
2020/02/06 18:06:46 file: status.kch mode: true

我不明白的是当我以十六进制打印模式时的输出。我希望 Mode 有点设置并且 os.ModeNamedPipe 有点掩码。所以我假设当文件不是命名管道时,info.Mode()&os.ModeNamedPipe 会产生整数 0。但是我得到了不同的值。

我终于找到了如何测试文件是否为命名管道的方法,但这是违反直觉的。

您能解释一下这些不同的输出吗?

最佳答案

info.Mode() 返回 os.FileMode 类型的值, os.ModeNamedPipe 也是 os.FileMode 类型。所以这将是您要打印/记录的值的类型。

os.FileMode 不仅仅是一个整数类型,它是一个独特的类型,它实现了 fmt.Stringer .并使用 %x 动词打印它,package doc 中的规则:

If the format (which is implicitly %v for Println etc.) is valid for a string (%s %q %v %x %X), the following two rules apply:

  1. If an operand implements the error interface, the Error method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any).

  2. If an operand implements method String() string, that method will be invoked to convert the object to a string, which will then be formatted as required by the verb (if any).

所以会先调用FileMode.String()方法,然后使用%x打印字符串值,即:

String and slice of bytes (treated equivalently with these verbs):

%x    base 16, lower-case, two characters per byte

所以您看到的 (2d2d2d2d2d2d2d2d2d2d) 是结果 os.FileMode 的字符串表示的 (UTF-8) 字节的六进制表示。如果它不是命名管道,它要么是“全破折号”,要么是前导 'p'

如果您想将其视为数字,您可以将其转换为整数 (uint32)(是的,os.ModeNamedPipe 仅设置了一位):

fmt.Printf("as-is         : %x\n", os.ModeNamedPipe)
fmt.Printf("hexa string : %x\n", os.ModeNamedPipe.String())
fmt.Printf("default string: %v\n", os.ModeNamedPipe.String())
fmt.Printf("decimal : %d\n", os.ModeNamedPipe)
fmt.Printf("hexa : %x\n", uint32(os.ModeNamedPipe))
fmt.Printf("binary : %b\n", os.ModeNamedPipe)

它输出(在 Go Playground 上尝试):

as-is         : 702d2d2d2d2d2d2d2d2d
hexa string : 702d2d2d2d2d2d2d2d2d
default string: p---------
decimal : 33554432
hexa : 2000000
binary : 10000000000000000000000000

关于go - 如何解释 os.FileMode 的显示值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60100267/

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