string - une - tabletop loup garou




Quand utiliser[] octet ou chaîne dans Go? (2)

Souvent en écrivant des applications Go, je me retrouve avec le choix d'utiliser []byte ou string . Mis à part la mutabilité évidente de []byte , comment puis-je 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 pour ne pas retourner une chaîne?
  2. []byte ne s'impriment pas aussi bien que les string par défaut, donc je me retrouve souvent à lancer des string à des fins de journalisation. Cela aurait-il toujours dû être une string ?
  3. Lors de l'ajout de []byte , un nouveau tableau sous-jacent est toujours créé. Si les données à préfixer sont constantes, pourquoi cela ne devrait-il pas être une string ?

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

  2. La conversion d'un []byte en string pour la journalisation n'est pas nécessaire. Les verbes 'text' typiques, comme %s , %q fonctionnent également pour string expressions string et []byte . Dans l'autre sens, la même chose vaut pour par exemple %x ou % 02x .

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


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

Une chaîne représente le texte. Juste du texte. L'encodage n'est pas quelque chose dont vous avez à vous soucier et toutes les opérations fonctionnent caractère par caractère, indépendamment du fait que le 'personnage' est réellement.

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

Étant donné que pratiquement tout ce qui concerne les octets a aussi des fonctions pour traiter les chaînes de caractères et vice versa, je suggère que plutôt que 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 comprenez les goulots d'étranglement.

EDIT: Ce post est l'endroit où j'ai eu la raison d'utiliser la conversion de type pour briser la chaîne.





go