Heim > Backend-Entwicklung > Golang > 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
Freigeben: 2024-02-12 20:20:09
nach vorne
1246 Leute haben es durchsucht

具有 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)
Nach dem Login kopieren

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")
Nach dem Login kopieren

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?
Nach dem Login kopieren

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"
    }
}
Nach dem Login kopieren

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))
Nach dem Login kopieren

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage