Existe-t-il un moyen simple de formater une chaîne dans Go sans imprimer la chaîne?
Je peux faire:
bar := "bar"
fmt.Printf("foo: %s", bar)
Mais je veux que la chaîne formatée soit retournée plutôt qu'imprimée pour que je puisse la manipuler davantage.
Je pourrais aussi faire quelque chose comme:
s := "foo: " + bar
Mais cela devient difficile à lire lorsque la chaîne de format est complexe, et encombrant lorsqu'une ou plusieurs des parties ne sont pas des chaînes et doivent être converties en premier, comme
i := 25
s := "foo: " + strconv.Itoa(i)
Existe-t-il un moyen plus simple de procéder?
string
go
formatting
string-formatting
Carnegie
la source
la source
1. Chaînes simples
Pour les chaînes "simples" (généralement ce qui tient dans une ligne), la solution la plus simple consiste à utiliser
fmt.Sprintf()
and friends (fmt.Sprint()
,fmt.Sprintln()
). Celles-ci sont analogues aux fonctions sans laS
lettre de démarrage , mais cesSxxx()
variantes renvoient le résultat austring
lieu de les imprimer sur la sortie standard.Par exemple:
La variable
s
sera initialisée avec la valeur:Astuce: Si vous souhaitez simplement concaténer des valeurs de différents types, vous n'aurez peut-être pas besoin d'utiliser automatiquement
Sprintf()
(ce qui nécessite une chaîne de formatage) comme c'estSprint()
exactement le cas. Voir cet exemple:Pour concaténer uniquement des
string
s, vous pouvez également utiliserstrings.Join()
où vous pouvez spécifier un séparateur personnaliséstring
(à placer entre les chaînes à joindre).Essayez-les sur le Go Playground .
2. Chaînes complexes (documents)
Si la chaîne que vous essayez de créer est plus complexe (par exemple un e-mail multiligne), elle
fmt.Sprintf()
devient moins lisible et moins efficace (surtout si vous devez le faire plusieurs fois).Pour cela, la bibliothèque standard fournit les packages
text/template
ethtml/template
. Ces packages implémentent des modèles basés sur les données pour générer une sortie textuelle.html/template
sert à générer une sortie HTML sûre contre l'injection de code. Il fournit la même interface que le packagetext/template
et doit être utilisé à la place detext/template
chaque fois que la sortie est HTML.L'utilisation des
template
packages nécessite essentiellement que vous fournissiez un modèle statique sous la forme d'unestring
valeur (qui peut provenir d'un fichier auquel cas vous ne fournissez que le nom du fichier) qui peut contenir du texte statique et des actions qui sont traitées et exécutées lorsque le Le moteur traite le modèle et génère la sortie.Vous pouvez fournir des paramètres qui sont inclus / substitués dans le modèle statique et qui peuvent contrôler le processus de génération de sortie. La forme typique de ces paramètres est
struct
s et lesmap
valeurs qui peuvent être imbriquées.Exemple:
Par exemple, supposons que vous souhaitiez générer des e-mails qui ressemblent à ceci:
Pour générer des corps de message électronique comme celui-ci, vous pouvez utiliser le modèle statique suivant:
Et fournissez des données comme celle-ci pour l'exécuter:
Normalement, la sortie des modèles est écrite dans un
io.Writer
, donc si vous voulez que le résultat soit unstring
, créez et écrivez dans unbytes.Buffer
(qui implémenteio.Writer
). Exécuter le modèle et obtenir le résultat sous la formestring
:Cela se traduira par la sortie attendue:
Essayez-le sur le Go Playground .
A noter également que depuis Go 1.10, une nouvelle alternative plus rapide, plus spécialisée est disponible pour ce
bytes.Buffer
qui est:strings.Builder
. L'utilisation est très similaire:Essayez celui-ci sur le Go Playground .
Remarque: vous pouvez également afficher le résultat d'une exécution de modèle si vous fournissez
os.Stdout
comme cible (qui implémente égalementio.Writer
):Cela écrira le résultat directement dans
os.Stdout
. Essayez ceci sur le Go Playground .la source
Dans votre cas, vous devez utiliser Sprintf () pour la chaîne de format.
func Sprintf(format string, a ...interface{}) string
Sprintf formate selon un spécificateur de format et renvoie la chaîne résultante.
s := fmt.Sprintf("Good Morning, This is %s and I'm living here from last %d years ", "John", 20)
Votre sortie sera:
la source
La fonction fmt.SprintF renvoie une chaîne et vous pouvez formater la chaîne de la même manière que vous le feriez avec fmt.PrintF
la source
Nous pouvons personnaliser un nouveau type de chaîne via
define new Type
avecFormat
support.la source