Maison > développement back-end > Golang > Pourquoi mon wrapper fmt.Fprintf imprime-t-il une sortie inattendue ?

Pourquoi mon wrapper fmt.Fprintf imprime-t-il une sortie inattendue ?

DDD
Libérer: 2024-11-12 22:51:02
original
473 Les gens l'ont consulté

Why Does My fmt.Fprintf Wrapper Print Unexpected Output?

Passer des arguments aux fonctions variadiques

Les fonctions variadiques dans Go acceptent un nombre variable d'arguments, qui sont stockés sous forme de tranche du type spécifié. Lors de l'appel d'une fonction variadique, il est essentiel de comprendre comment les arguments sont transmis.

Problème : sortie supplémentaire dans le wrapper fmt.Fprintf

Considérez le code suivant qui tente de créer un wrapper autour de fmt.Fprintf. avec des arguments de longueur variable :

func Die(format string, args ...interface{}) {
    str := fmt.Sprintf(format, args)
    fmt.Fprintf(os.Stderr, "%v\n", str)
    os.Exit(1)
}
Copier après la connexion

Lors de l'appel de Die("foo"), la sortie contient l'inattendu "%%!(EXTRA []interface {}=[])".

Solution : utiliser des points de suspension... pour transmettre des arguments

Le problème survient lors du passage de la tranche d'arguments directement à fmt .Sprintf. Pour transmettre correctement les arguments individuellement, l'opérateur points de suspension ... doit être utilisé :

package main

import (
    "fmt"
    "os"
)

func Die(format string, args ...interface{}) {
    str := fmt.Sprintf(format, args...)
    fmt.Fprintf(os.Stderr, "%v\n", str)
    os.Exit(1)
}

func main() {
    Die("foo")
}
Copier après la connexion

En utilisant ..., chaque élément de la tranche args est passé comme argument distinct à fmt.Sprintf, résolvant le problème et produire le résultat attendu :

foo
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal