2010-08-01 12 views
0

Je peux facilement écrire une chaîne sur une connexion en utilisant io.WriteString.Lecture de données codées en utf8 à partir d'une connexion, en utilisant Go

Cependant, je ne peux pas sembler facilement lire une chaîne à partir d'une connexion. La seule chose que je peux lire à partir de la connexion sont des octets, ce qui, semble-t-il, doit ensuite être converti en une chaîne.

En supposant que les octets représentent une chaîne encodée en utf8, comment les convertir en forme de chaîne?

(Edit: Sinon, comment pourrais-je lire simplement une chaîne à partir d'une connexion)

Merci!

Répondre

2

Vous pouvez juste jeté une tranche d'octets dans une chaîne:

var foo []byte 
var bar string = string(foo) 

Il n'y a pas de codage/décodage impliqué, parce que les chaînes sont traités comme de simples tableaux d'octets.

+0

Ce n'est pas 100% vrai, mais assez proche. Les chaînes sont traitées différemment des tableaux d'octets. – cthom06

+0

Juste curieux, comment vérifier quand la fin de la chaîne (ou la fin de char) atteint? Ou puis-je lire char par char (en utilisant cast) pour construire la chaîne à partir de la connexion? – helios

4

Un outil pratique qui répondra à vos besoins peut être trouvé dans la bibliothèque standard: bytes.Buffer (see the package docs).

Supposons que vous avez un objet qui implémente io.Reader (qui est, il a une méthode avec la signature Read([]byte) (int, os.Error)).

Un exemple courant est un os.File:

f, err := os.Open("/etc/passwd", os.O_RDONLY, 0644) 

Si vous voulez lire le contenu de ce fichier dans une chaîne, créez simplement un bytes.Buffer (sa valeur zéro est un tampon prêt à l'emploi, de sorte que vous n'avez pas besoin d'appeler un constructeur):

var b bytes.Buffer 

Utilisez io.Copy pour copier le contenu du fichier dans la mémoire tampon:

n, err := io.Copy(b, f) 

(Une alternative à l'utilisation io.Copy serait b.ReadFrom(f) - ils sont plus ou moins les mêmes.)

Et appelez la méthode chaîne de la mémoire tampon pour récupérer le contenu du tampon comme une chaîne:

s := b.String() 

Le bytes.Buffer grandira automatiquement pour stocker le contenu du fichier, de sorte que vous n'avez pas à vous soucier de l'allocation et de plus en plus byte tranches, etc.