Как представить пустой байт в Go - PullRequest
0 голосов
/ 16 апреля 2019

Хотите иметь пустой символ / байт нулевого размера / длины в Go, например byte("").


func main() {
    var a byte = '' // not working
    var a byte = 0  // not working
}

Более конкретный пример:


func removeOuterParentheses(S string) string {
    var stack []int
    var res []byte
    for i, b := range []byte(S) {
        if b == '(' {
            stack = append(stack, i)
        } else {
            if len(stack) == 1 {
                res[stack[0]] = '' // set this byte to be empty
                res[i] = '' // / set this byte to be empty
            }
            stack = stack[:len(stack)-1]
        }
    }
    return string(res)
}

Существует эквивалентный вопрос в Java

1 Ответ

0 голосов
/ 21 апреля 2019

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, которые можно использовать в качестве отправной точки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...