web-dev-qa-db-fra.com

Quand utiliser [] octet ou chaîne en déplacement?

Fréquemment par écrit, allez des applications, je me trouve avec le choix d'utiliser []byte ou string. En dehors de l'éventuelle mutabilité de []byte Comment puis-je décider lequel utiliser?

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

  1. Une fonction renvoie une nouvelle []byte. Puisque la capacité de la tranche est fixée, quelle raison est-elle là pour ne pas renvoyer une chaîne?
  2. []byte ne sont pas imprimés aussi bien que string par défaut, donc je me trouve souvent jetant à string à des fins de journalisation. Devrait-il toujours être un string?
  3. Lorsque vous prépendiez []byte, une nouvelle matrice sous-jacente est toujours créée. Si les données à adopter sont constantes, pourquoi ne pas être un string?
60
Matt Joiner

Mon conseil serait d'utiliser String Par défaut lorsque vous travaillez avec du texte. Mais utilisez [] octet à la place si l'une des conditions suivantes s'applique:

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

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

28
andybalholm
  1. Une différence est que le retour []byte Peut être potentiellement réutilisé pour contenir une autre/de nouvelles données (sans nouvelle allocation de mémoire), tandis que string ne peut pas. Un autre est que, dans la mise en œuvre du CPG au moins, string est une entité inférieure d'un mot que []byte. Peut être utilisé pour sauver une certaine mémoire lorsqu'il y a beaucoup d'articles de ce type.

  2. Jeter un []byte à string pour la journalisation n'est pas nécessaire. Verbes typiques de "texte", comme %s, %q Travailler pour string et []byte expressions de manière égale. Dans l'autre direction, il en va de même pour par exemple. %x ou % 02x.

  3. Dépend de la raison pour laquelle la concaténation est-elle effectuée et si le résultat doit être encore combiné avec quelque chose/ailleurs après. Si c'est le cas alors []byte peut performer mieux.

6
zzzz