L'éditeur PHP Zimo est là pour répondre à une question sur la fonction Sprintf. Parfois, nous devons utiliser la fonction Sprintf pour formater une chaîne, mais dans certains cas, nous pouvons rencontrer une situation avec des paramètres de trois types de pointeurs différents, et ces paramètres peuvent être nuls. Dans ce cas, nous ne pouvons pas utiliser l’opérateur ternaire, sinon le code deviendra verbeux et peu lisible. Alors, comment éviter d’écrire des dizaines de lignes de code long ? Ensuite, je partagerai avec vous une solution simple.
Je souhaite créer cette chaîne en utilisant sprintf
message := fmt.sprintf("unit %s has a level of %v, but is of category %v", *entity.name, *entity.levelcode, *entity.categorycode)
Dans les entités, les variables sont des pointeurs, qui peuvent être nil
:
name
是 *string
levelcode
具有 *levelcode
Typecategorycode
具有 *categorycode
TypeMais s'ils ont une valeur, je veux la valeur et non le pointeur. (c'est-à-dire que l'unité abc a le niveau zéro mais appartient à la catégorie des composants logiciels enfichables )
Peu importe la langue que j'utilise, j'écrirai comme ceci :
message := fmt.sprintf("unit %s has a level of %v, but is of %v category", entity.name != nil ? *entity.name : "nil", entity.levelcode != nil ? *entity.levelcode : "nil", entity.categorycode != nil ? *entity.categorycode : "nil")
Mais go n'autorise pas l'opérateur ternaire. Si je ne gère pas les valeurs nulles, sprintf
lèvera une exception.
Alors, dois-je commencer comme ça ?
if entity.Name == nil && entity.LevelCode != nil && entity.CategoryCode != nil) { message := "Unit nil has a Level of nil, but is of nil Category" } else { if entity.Name != nil && entity.LevelCode != nil && entity.CategoryCode != nil) { message := fmt.Sprintf("Unit %s has a Level of nil, but is of nil Category", entity.Name != nil ? *entity.Name : "nil") } else { ... for 9 combinations of values nil or not nil values, and 9 sprintf formats? } } What the shortest way to dump my variables content in a formatted line?
Merci, avec votre aide, j'ai réussi à créer la fonction.
// value treat pointers that can be nil, and return their values if they aren't. func value[t any](v *t) string { if (v != nil) { return fmt.sprintf("%v", *v) } else { return "nil" } }
Appelé comme ça
message := fmt.Sprintf("Unit %s has a Level of %v, but is of %v Category", value(entity.Name), value(entity.LevelCode), value(entity.CategoryCode))
Écrire cinq déclarations pour une seule sprintf
... mais ça marche.
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!