Quand utiliser octet ou chaîne dans Go?

Fréquemment en écrivant des applications Go, je me retrouve avec le choix d’utiliser []byte ou ssortingng . Mis à part la mutabilité évidente de []byte , comment décider lequel utiliser?

J’ai plusieurs cas d’utilisation pour des exemples:

  1. Une fonction renvoie un nouvel []byte . Puisque la capacité de la tranche est fixe, quelle est la raison de ne pas renvoyer une chaîne?
  2. []byte ne sont pas imprimés aussi bien que ssortingng par défaut, donc je me retrouve souvent à lancer des ssortingng à des fins de journalisation. Est-ce que ça devait toujours être une ssortingng ?
  3. En ajoutant []byte , un nouveau tableau sous-jacent est toujours créé. Si les données à append sont constantes, pourquoi cela ne devrait-il pas être une ssortingng ?

Mon conseil serait d’utiliser la chaîne par défaut lorsque vous travaillez avec du texte. Mais utilisez plutôt [] octet si l’une des conditions suivantes s’applique:

  • La mutabilité d’un octet réduira considérablement le nombre d’allocations nécessaires.

  • Vous traitez avec une API qui utilise [] byte et éviter une conversion en chaîne simplifiera votre code.

J’ai l’impression que, dans Go, plus que dans tout autre langage de style non-ML, le type est utilisé pour transmettre un sens et une utilisation prévue. Ainsi, la meilleure façon de déterminer quel type utiliser est de vous demander quelles sont les données.

Une chaîne représente du texte. Juste du texte. L’encodage n’est pas quelque chose dont vous devez vous préoccuper et toutes les opérations fonctionnent sur une base caractère par caractère, indépendamment du fait qu’un “caractère” soit réellement.

Un tableau représente des données binarys ou un codage spécifique de ces données. []byte signifie que les données sont soit un stream d’octets, soit un stream de caractères à un seul octet. []int16 représente un stream entier ou un stream de caractères de deux octets.

Étant donné que quasiment tout ce qui concerne les octets a aussi des fonctions pour gérer les chaînes et vice versa, je suggère qu’au lieu de demander ce que vous devez faire avec les données, vous demandez ce que ces données représentent. Et puis optimisez les choses une fois que vous trouvez des goulots d’étranglement.

EDIT: Cet article est la raison pour laquelle j’ai utilisé la conversion de type pour briser la chaîne.

  1. Une différence est que l’ []byte renvoyé peut être potentiellement réutilisé pour contenir d’autres données / nouvelles (sans nouvelle allocation de mémoire), tandis que la ssortingng ne peut pas. Un autre est que, dans l’implémentation de gc au moins, ssortingng est une entité d’un mot plus petit que []byte . Peut être utilisé pour économiser de la mémoire lorsqu’il y a beaucoup de ces éléments en direct.

  2. La conversion d’un []byte en ssortingng pour la journalisation n’est pas nécessaire. Les verbes «texte» typiques, tels que %s , %q fonctionnent pour ssortingng expressions ssortingng et []byte manière égale. Dans l’autre sens, la même chose vaut par exemple pour %x ou % 02x .

  3. Cela dépend de la raison pour laquelle la concaténation est effectuée et si le résultat doit toujours être combiné avec quelque chose / quelque part après. Si tel est le cas, alors l’ []byte peut mieux fonctionner.