Heim  >  Artikel  >  Backend-Entwicklung  >  Sprintf mit 3 Argumenten verschiedener Zeigertypen (kann Null sein). Der ternäre Operator ist nicht verfügbar. Wie vermeide ich das Schreiben Dutzender Zeilen?

Sprintf mit 3 Argumenten verschiedener Zeigertypen (kann Null sein). Der ternäre Operator ist nicht verfügbar. Wie vermeide ich das Schreiben Dutzender Zeilen?

WBOY
WBOYnach vorne
2024-02-12 20:20:091140Durchsuche

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

PHP-Editor Zimo ist hier, um eine Frage zur Sprintf-Funktion zu beantworten. Manchmal müssen wir die Sprintf-Funktion verwenden, um eine Zeichenfolge zu formatieren, aber in einigen Fällen können wir auf eine Situation mit Parametern von drei verschiedenen Zeigertypen stoßen, und diese Parameter können Null sein. In diesem Fall können wir den ternären Operator nicht verwenden, da der Code sonst ausführlich und nicht leicht lesbar wird. Wie sollten wir also vermeiden, Dutzende Zeilen langen Codes zu schreiben? Als nächstes werde ich Ihnen eine einfache Lösung vorstellen.

Frageninhalt

Ich möchte diese Zeichenfolge mit sprintf

erstellen
message := fmt.sprintf("unit %s has a level of %v, but is of category %v",
    *entity.name, *entity.levelcode, *entity.categorycode)

In Entitäten sind Variablen Zeiger, die nil:

sein können
  • name*string
  • levelcode 具有 *levelcodeTyp
  • categorycode 具有 *categorycodeTyp

Aber wenn sie einen Wert haben, möchte ich den Wert und nicht den Zeiger. (d. h. Einheit abc hat Level Null, gehört aber zur Snap-In-Kategorie )

Egal welche Sprache ich verwende, ich werde so schreiben:

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")

Go erlaubt jedoch keinen ternären Operator. Wenn ich keine Nullwerte verarbeite, löst sprintf eine Ausnahme aus.

Muss ich also so anfangen?

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?

Lösung

Vielen Dank, mit Ihrer Hilfe habe ich die Funktion erfolgreich erstellt.

// 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"
    }
}

So genannt

message := fmt.Sprintf("Unit %s has a Level of %v, but is of %v Category",
    value(entity.Name), value(entity.LevelCode), value(entity.CategoryCode))

Fünf Aussagen für eine einzige schreiben sprintf...aber es funktioniert.

Das obige ist der detaillierte Inhalt vonSprintf mit 3 Argumenten verschiedener Zeigertypen (kann Null sein). Der ternäre Operator ist nicht verfügbar. Wie vermeide ich das Schreiben Dutzender Zeilen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen