97 votes

Quand utiliser []octet ou chaîne en Go ?

Souvent, en écrivant des applications Go, je me retrouve avec le choix d'utiliser []byte o string . En dehors de la mutabilité évidente de []byte comment décider lequel utiliser ?

J'ai plusieurs cas d'utilisation à titre d'exemple :

  1. Une fonction renvoie un nouveau []byte . Puisque la capacité de la tranche est fixe, quelle raison y a-t-il de ne pas retourner une chaîne de caractères ?
  2. []byte ne sont pas imprimés aussi bien que string par défaut, donc je me retrouve souvent à faire un casting pour string à des fins de journalisation. Aurait-il fallu que ce soit toujours un string ?
  3. Lorsque l'on ajoute au préalable []byte un nouveau tableau sous-jacent est toujours créé. Si les données à ajouter sont constantes, pourquoi ne serait-ce pas un tableau de type string ?

54voto

andybalholm Points 3197

Je vous conseille d'utiliser string par défaut lorsque vous travaillez avec du texte. Mais utilisez []byte à la place si l'une des conditions suivantes s'applique :

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

  • Vous avez affaire à une API qui utilise []byte, et éviter une conversion en chaîne simplifiera votre code.

22voto

Abhay Buch Points 1748

J'ai l'impression qu'en Go, plus qu'en tout autre langage non ML, la typographie est utilisée pour transmettre le sens et l'utilisation prévue. Ainsi, la meilleure façon de déterminer quel type utiliser est de se demander ce que les données doivent contenir. est .

Une chaîne de caractères représente du texte. Juste du texte. Vous n'avez pas à vous soucier de l'encodage et toutes les opérations fonctionnent caractère par caractère, indépendamment de ce qu'est réellement un "caractère".

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

Étant donné que pratiquement tout ce qui traite des octets possède également des fonctions pour traiter les chaînes de caractères et vice versa, je suggère qu'au lieu de demander ce que vous devez faire avec les données, vous demandiez ce que ces données représentent. Puis d'optimiser les choses une fois que vous aurez identifié les goulots d'étranglement.

EDIT : Ce poste C'est là que j'ai trouvé le raisonnement pour utiliser la conversion de type pour casser la chaîne.

11voto

zzzz Points 23017
  1. Une différence est que le retour []byte peut être potentiellement réutilisé pour contenir d'autres/nouvelles données (sans nouvelle allocation de mémoire), alors que string ne peut pas. Une autre raison est que, dans l'implémentation de gc, au moins moins, string est une entité plus petite d'un mot que []byte . Peut être utilisé pour économiser de la mémoire quand il y a beaucoup d'éléments de ce type en direct.

  2. Couler un []byte a string pour la journalisation n'est pas nécessaire. Les verbes "texte" typiques, comme %s , %q travailler pour string y []byte expressions de manière égale. Dans l'autre sens, il en va de même, par exemple pour %x o % 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é. être à nouveau combiné avec quelque chose/quelque chose d'autre par la suite. Si c'est le cas, alors []byte peut être plus performant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X