Подтвердить что ты не робот

Когда использовать [] байт или строку в Go?

Часто в письменном виде Приложения Go, я нахожусь с выбором для использования []byte или string. Помимо очевидной изменчивости []byte, как я могу решить, какой из них использовать?

У меня есть несколько примеров использования:

  • Функция возвращает новый []byte. Поскольку емкость среза фиксирована, какая причина заключается в том, чтобы не возвращать строку?
  • []byte по умолчанию не печатаются так же хорошо, как string, поэтому я часто нахожу, что я использую string для ведения журнала. Должно ли всегда быть string?
  • При добавлении []byte всегда создается новый базовый массив. Если данные для prepend являются постоянными, почему это не должно быть string?
4b9b3361

Ответ 1

Мой совет - использовать строку по умолчанию, когда вы работаете с текстом. Но используйте [] байт, если применяется одно из следующих условий:

  • Изменчивость байт [] значительно сократит количество необходимых распределений.

  • Вы имеете дело с API, который использует [] байт, и избежать преобразования в строку упростит ваш код.

Ответ 2

Я понял, что в Go больше, чем в любом другом языке стиля, отличном от ML, этот тип используется для передачи смысла и предполагаемого использования. Таким образом, лучший способ выяснить, какой тип использовать, - спросить себя, что такое данные.

Строка представляет текст. Просто текст. Кодирование не является чем-то, о чем вам нужно беспокоиться, и все операции работают над символьным символом, независимо от того, что на самом деле есть символ.

Массив представляет либо двоичные данные, либо конкретную кодировку этих данных. []byte означает, что данные являются либо просто байтовым потоком, либо потоком однобайтовых символов. []int16 представляет собой целочисленный поток или поток из двух байтовых символов.

Учитывая тот факт, что почти все, что касается байтов, также имеет функции для обработки строк и наоборот, я бы предложил, чтобы вместо того, чтобы спрашивать, что вам нужно делать с данными, вы спрашиваете, что представляют эти данные. А затем оптимизируйте ситуацию, как только вы выясните узкие места.

EDIT: Это сообщение, где я получил обоснование использования преобразования типов для разбивки строки.

Ответ 3

  • Одно отличие состоит в том, что возвращаемый []byte может быть потенциально повторно использовать для хранения других/новых данных (без нового распределения памяти), в то время как string не может. Другим является то, что в реализации gc в наименьшее, string - это меньшее слово, чем []byte. Возможно используется для сохранения некоторой памяти, когда в ней много таких элементов.

  • Отправка []byte в string для ведения журнала не требуется. Типичные "текстовые" глаголы, такие как %s, %q работают для выражений string и []byte в равной степени. В другом направлении то же самое имеет место, например. %x или % 02x.

  • Зависит от того, почему выполняется конкатенация, и если результат всегда чтобы снова быть объединены с чем-то/где-то еще после этого. Если это случай, то []byte может работать лучше.