Comment faire pour ajouter un caractère d'une chaîne en Golang?
Comment ajouter un caractère d'une chaîne en Aller?
Cela ne fonctionne pas:
s := "hello";
c := 'x';
fmt.Println(s + c);
opération non valide: s + c (décalage types de chaîne et de runes)
Cela ne fonctionne pas non plus:
s := "hello";
c := 'x';
fmt.Println(s + rune(c));
opération non valide: s + rune(c) (décalage types de chaîne et de runes)
Êtes-vous à la question et la réponse en même temps? Pour quoi?
Parce que je ne pouvais pas trouver la réponse sur un débordement de pile plus tôt, et google a donné de bon résultats. C'est une pratique standard.
Je crois que la pratique courante est de poser des questions lorsque vous ne connaissez pas la réponse.
Si vous cliquez sur Poser une Question, vous verrez une case à cocher Répondre à votre question. C'est en fait encouragé par ce post à partir de la poser la question.
Ce que @Tinwor écrit, c'est exactement ce que je voulais dire. C'est OK pour répondre à vos propres questions, mais il est inutile de demander si vous déjà avoir une réponse. Si vous l'avez posté, puis a travaillé à travers elle et est venu avec une solution, je n'aurais pas l'esprit que.
Parce que je ne pouvais pas trouver la réponse sur un débordement de pile plus tôt, et google a donné de bon résultats. C'est une pratique standard.
Je crois que la pratique courante est de poser des questions lorsque vous ne connaissez pas la réponse.
Si vous cliquez sur Poser une Question, vous verrez une case à cocher Répondre à votre question. C'est en fait encouragé par ce post à partir de la poser la question.
Ce que @Tinwor écrit, c'est exactement ce que je voulais dire. C'est OK pour répondre à vos propres questions, mais il est inutile de demander si vous déjà avoir une réponse. Si vous l'avez posté, puis a travaillé à travers elle et est venu avec une solution, je n'aurais pas l'esprit que.
OriginalL'auteur cohadar | 2016-10-28
Vous devez vous connecter pour publier un commentaire.
En Aller rune type est pas un type de caractère, c'est juste un autre nom pour int32.
Si vous venez de Java ou un langage similaire cela va vous surprendre, car Java est du type char et vous pouvez ajouter char à une chaîne.
En Aller, vous devez être plus explicite:
Omg avez-vous vraiment besoin de convertir tous les caractères d'une chaîne de caractères constante? Oui, mais ne vous inquiétez pas, c'est juste à cause du type de système et le compilateur optimise correctement. Sous le capot, le Java et Aller ajouter le char de la même manière.
Si vous pensez supplémentaire taper le suce, il suffit de comparer combien de fois chaîne mot-clé apparaît dans chaque exemple ci-dessus. 🙂
Infos supplémentaires: (détails techniques)
En Aller chaînes sont pas séquences de runes, ils sont utf-8 codé séquences de runes. Lorsque vous gamme sur une chaîne, que vous obtenez des runes, mais vous ne pouvez pas tout simplement ajouter une rune à une chaîne.
Par exemple: symbole de l'euro '€' est un entier 0x20AC (ce qui est appelé le point de code)
Mais lorsque vous encodez signe euro en utf-8, vous obtenez 3 octets: 0xE2 0x82 0xAC
http://www.fileformat.info/info/unicode/char/20aC/index.htm
Donc l'ajout d'un char en fait, il fonctionne comme ceci:
Noter que l'encodage se fait au moment de la compilation.
Utf-8 peut encoder un caractère avec 1, 2, 3 ou 4 octets.
Utf-16 pouvez encoder un caractère avec 2 ou 4 octets.
Alors, Allez généralement ajoute 1 octet (ascii) ou de 2, 3, 4 octets pour les Chinois, et Java généralement ajoute 2 octets (ascii) ou 4 octets pour les Chinois.
Puisque la plupart des personnages que nous (à l'ouest) l'utilisation peut être codé avec 2 octets Java donne la fausse croyance que les chaînes sont des séquences de 2byte char-s, ce qui est vrai jusqu'à ce que vous avez besoin pour coder 美国必须死
En fait, ils ne sont pas parce que tous les octets de la séquence est une chaîne valide. Ils peuvent être de type intégré dans les séquences d'octets.
Non, je vous assure qu'ils sont (il n'y a pas de conversion de type, seulement de la conversion). La chaîne de la structure de données se compose uniquement d'un tableau d'octets, et la longueur de ce tableau. La gamme de l'opérateur scanne pour les runes, mais la chaîne est toujours en octets. Le
string
et[]byte
types ont le même sous-jacent de données, et peuvent être convertis dans les deux directions. play.golang.org/p/TBiD44CUI2c'est en montrant l'octet d'index, ce qui exactement ce que j'ai dit et démontré dans mon commentaire. La même chose sans
range
ressemble: play.golang.org/p/fDjZYSdkIv (et pour faire bonne mesure, le[]byte
équivalent de trop play.golang.org/p/NgBiQvs4Yr)oui, vous avez raison. Je voulais juste faire remarquer que même tu "sous le capot" certaines choses sont les mêmes, ne signifie pas que le type est le même. Par exemple int32 et unit32 sont même sous le capot, mais se comportent différemment dans le signe des opérations ou lors de l'impression. Cela contraste avec int32 et de la rune qui sont les mêmes à la fois en valeur et en type (alias)
OriginalL'auteur cohadar