A byte
- псевдоним типа uint8
. Наличие «пустого байта» на самом деле не имеет никакого смысла, так же как и наличие «пустого числа» не имеет никакого смысла (у вас может быть число 0, но что такое «пустое» число?)
Вы можете присвоить нулевое значение (b := byte(0)
или var b byte
), которое может использоваться для указания того, что еще ничего не назначено («нулевое значение»). Значение байта 0
известно как «нулевой байт». Обычно он никогда не встречается в обычном тексте, но часто встречается в двоичных данных (например, изображения, сжатые файлы и т. Д.)
Это отличается от byte("")
, который представляет собой последовательность байтов. Вы можете иметь последовательность нулевых байтов. Чтобы привести аналогию: у меня может быть кошелек без денег, но у меня не может быть монеты, которая стоит «пусто».
Если вы действительно хотите провести различие между «значением 0» и «никогда не устанавливать», вы можете использовать либо указатель, либо структуру. Пример с указателем:
var b *byte
fmt.Println(b) // <nil>, since it's a pointer which has no address to point to.
one := byte(0)
b = &one // Set address to one.
fmt.Println(b, *b) // 0xc000014178 0 (first value will be different, as it's
// a memory address).
Здесь вам нужно быть немного осторожнее, так как *b
будет паникой, если вы еще не присвоили значение. В зависимости от того, как он используется, он может либо работать достаточно хорошо, либо работать с ним очень неудобно. Примером, где это используется в стандартной библиотеке, является flag
пакет .
Другая возможность состоит в том, чтобы использовать структуру с отдельными полями для самого байта и флаг, чтобы записывать, был ли он установлен или нет. В библиотеке database/sql
уже есть типы Null*
(например, NullInt64
, которые можно использовать в качестве отправной точки.