Maison  >  Article  >  développement back-end  >  Sprintf avec 3 arguments de types de pointeurs différents (peut être nul). L'opérateur ternaire n'est pas disponible, comment éviter d'écrire des dizaines de lignes ?

Sprintf avec 3 arguments de types de pointeurs différents (peut être nul). L'opérateur ternaire n'est pas disponible, comment éviter d'écrire des dizaines de lignes ?

WBOY
WBOYavant
2024-02-12 20:20:091186parcourir

具有 3 个不同指针类型的参数(可以为 nil)的 Sprintf。三元运算符不可用,如何避免写几十行?

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.

Contenu de la question

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 具有 *levelcodeType
  • categorycode 具有 *categorycodeType

Mais 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?

Solution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer