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.
Ich möchte diese Zeichenfolge mit sprintf
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
:
name
是 *string
levelcode
具有 *levelcode
Typcategorycode
具有 *categorycode
TypAber 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?
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!