2017-10-20 7 views
0

w est de type http.ResponseWriterchaîne passant golang contenant "%" à ​​http.ResponseWriter provoque variable manquante

Cela est bien:

fmt.Fprintf(w, statusPercentage + " " + mostUpToDateStatusDownloaded + "/"+ mostUpToDateStatusOverallData) 

sortie: 100 488 MB/488 MB

Cela pose un problème:

fmt.Fprintf(w, statusPercentage + "% " + mostUpToDateStatusDownloaded + "/"+ mostUpToDateStatusOverallData) 

sortie: 100%! (MANQUANT) MB/488 Mo

+0

Problème résolu! Il s'est avéré que je dois échapper au signe de pourcentage en utilisant double%. Reportez-vous à https://stackoverflow.com/questions/1860159/how-to-escape-the-percent-sign-in-cs-printf pour plus d'informations. – Bruce

+1

Vous avez peut-être entendu parler de Println. – Volker

Répondre

4

% est un symbole d'espace réservé spécial. Si vous voulez le mettre dans une chaîne comme un symbole lui-même - le dupliquer. Comme:

fmt.Fprintf(w, "Growth %v %%", "50") 

Sortie:

Growth 50% 
+0

Votre code utilise des guillemets incorrects. Plus précisément: 'caractère d'identification invalide U + 201C '"' 'et 'caractère d'identification invalide U + 201D'" '' – tgogos

+2

@tgogos, merci, corrigé. – kostix

+0

Désolé, j'ai envoyé à partir de téléphone portable - et ressemble à l'autocorrection a décidé de changer les symboles. –

4

Il est généralement pas une bonne pratique d'utiliser des chaînes d'applications arbitraires comme le spécificateur de format à fmt.Fprintf et les amis. L'application doit utiliser une chaîne de format fixe ou convertir la chaîne en octets et écrire les octets directement dans la réponse.

Voici comment le faire avec une chaîne de format:

// note that '%' is quoted as %% 
fmt.Fprintf(w, "%s%% %s/%s", statusPercentage, mostUpToDateStatusDownloaded, mostUpToDateStatusOverallData) 

Voici comment sauter le formatage et écrire directement à la réponse:

io.WriteString(w, statusPercentage + "% " + mostUpToDateStatusDownloaded + "/"+ mostUpToDateStatusOverallData)