Когда использовать [] байт или строку в Go?
Часто в письменном виде Приложения Go, я нахожусь с выбором для использования []byte
или string
. Помимо очевидной изменчивости []byte
, как я могу решить, какой из них использовать?
У меня есть несколько примеров использования:
- Функция возвращает новый
[]byte
. Поскольку емкость среза фиксирована, какая причина заключается в том, чтобы не возвращать строку?
-
[]byte
по умолчанию не печатаются так же хорошо, как string
, поэтому я часто нахожу, что я использую string
для ведения журнала. Должно ли всегда быть string
?
- При добавлении
[]byte
всегда создается новый базовый массив. Если данные для prepend являются постоянными, почему это не должно быть string
?
Ответы
Ответ 1
Мой совет - использовать строку по умолчанию, когда вы работаете с текстом. Но используйте [] байт, если применяется одно из следующих условий:
-
Изменчивость байт [] значительно сократит количество необходимых распределений.
-
Вы имеете дело с API, который использует [] байт, и избежать преобразования в строку упростит ваш код.
Ответ 2
Я понял, что в Go больше, чем в любом другом языке стиля, отличном от ML, этот тип используется для передачи смысла и предполагаемого использования. Таким образом, лучший способ выяснить, какой тип использовать, - спросить себя, что такое данные.
Строка представляет текст. Просто текст. Кодирование не является чем-то, о чем вам нужно беспокоиться, и все операции работают над символьным символом, независимо от того, что на самом деле есть символ.
Массив представляет либо двоичные данные, либо конкретную кодировку этих данных. []byte
означает, что данные являются либо просто байтовым потоком, либо потоком однобайтовых символов. []int16
представляет собой целочисленный поток или поток из двух байтовых символов.
Учитывая тот факт, что почти все, что касается байтов, также имеет функции для обработки строк и наоборот, я бы предложил, чтобы вместо того, чтобы спрашивать, что вам нужно делать с данными, вы спрашиваете, что представляют эти данные. А затем оптимизируйте ситуацию, как только вы выясните узкие места.
EDIT: Это сообщение, где я получил обоснование использования преобразования типов для разбивки строки.
Ответ 3
-
Одно отличие состоит в том, что возвращаемый []byte
может быть потенциально
повторно использовать для хранения других/новых данных (без нового распределения памяти), в то время как
string
не может. Другим является то, что в реализации gc в
наименьшее, string
- это меньшее слово, чем []byte
. Возможно
используется для сохранения некоторой памяти, когда в ней много таких элементов.
-
Отправка []byte
в string
для ведения журнала не требуется. Типичные "текстовые" глаголы, такие как %s
, %q
работают для выражений string
и []byte
в равной степени. В другом направлении то же самое имеет место, например. %x
или % 02x
.
-
Зависит от того, почему выполняется конкатенация, и если результат всегда
чтобы снова быть объединены с чем-то/где-то еще после этого. Если это случай, то []byte
может работать лучше.