info.Mode()
возвращает значение типа os.FileMode
, а os.ModeNamedPipe
также имеет тип os.FileMode
. Так что это будет тип значения, которое вы хотите напечатать / log.
os.FileMode
- это не просто целочисленный тип, это отдельный тип, который реализует fmt.Stringer
, И печатая его с помощью глагола %x
, правила из пакета делают c:
Если формат (который неявно% v для Println et c .) действительно для строки (% s% q% v% x% X), применяются следующие два правила:
Если в операнде реализован интерфейс ошибок, будет вызван метод Error для преобразования объекта в строку, которая затем будет отформатирована в соответствии с требованиями глагола (если есть).
Если в операнде реализован метод String () string, этот метод будет вызываться для преобразования объекта в строку, которая затем будет отформатирована в соответствии с требованиями глагола (если есть).
Итак, сначала будет вызван метод FileMode.String()
, а затем будет напечатано строковое значение с использованием %x
, что означает:
String and slice of Bytes ( обрабатывается эквивалентно этими глаголами):
%x base 16, lower-case, two characters per byte
Итак, что вы видите (2d2d2d2d2d2d2d2d2d2d
) - это гекса-представление (UTF-8) байтов строкового представления результирующего os.FileMode
, Он либо «полон тире», если это не именованный канал, в противном случае он имеет начальный '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