Heim  >  Artikel  >  Backend-Entwicklung  >  Sind Formatierungsanweisungen in variadischen Funktionen erforderlich?

Sind Formatierungsanweisungen in variadischen Funktionen erforderlich?

WBOY
WBOYnach vorne
2024-02-09 14:40:091108Durchsuche

Sind Formatierungsanweisungen in variadischen Funktionen erforderlich?

In PHP sind variadische Funktionen eine sehr praktische Funktion, die es uns ermöglicht, eine unbegrenzte Anzahl von Parametern in der Funktionsdefinition zu verwenden. Ob Sie jedoch Formatierungsanweisungen in verschiedenen Funktionen verwenden müssen, hängt von Ihren spezifischen Anforderungen ab. Formatanweisungen werden normalerweise verwendet, um Parameter in einem bestimmten Format auszugeben oder zu verarbeiten. Wenn Sie beispielsweise die Funktion printf() verwenden, müssen Sie eine Formatzeichenfolge angeben. Wenn Sie Parameter in einer variablen Parameterfunktion formatieren müssen, müssen Sie natürlich Formatierungsanweisungen verwenden. Wenn Sie jedoch lediglich Parameter an andere Funktionen übergeben oder einige grundlegende Vorgänge ausführen, ist die Verwendung von Formatierungsanweisungen nicht erforderlich. Kurz gesagt: Ob Sie Formatierungsanweisungen in verschiedenen Funktionen verwenden müssen, hängt von den spezifischen Geschäftsanforderungen ab.

Frageninhalt

Ich habe eine variadische Funktion respond ,它接受几个位置参数,并在末尾传播一个 any 切片。根据上下文,该函数以不同的方式使用最后一个参数(请注意 messagedata 如何根据 status, die je nach Wert variiert. ):

func respond(w http.responsewriter, status int, format string, a ...any) {
    var (
        statusok bool
        message  string
        data     interface{}
    )
    if status >= 300 {
        statusok = false
        message = fmt.sprintf(format, a...)
        data = nil
        log.error().msg(message)
    } else {
        statusok = true
        message = format
        data = a[0]
        log.info().msg(fmt.sprintf("%d", status))
    }
    // issue response
    responder := render.new()
    responder.json(w, status, map[string]interface{}{
        "statusok": statusok,
        "status":   status,
        "message":  message,
        "data":     data,
    })
}

Ich erhalte keine Warnungen für den folgenden Anruf:

respond(w, http.statusnotfound, "person %v does not exist", personid)

Aber für die nächste Warnung respond 调用有参数,但没有引发格式化指令 (但代码按预期运行,personstruct):

respond(w, http.StatusAccepted, "updated", person)

Für mein Amateurauge sieht es so aus, als ob die Variadic-Funktion am Ende eine Formatzeichenfolge und ein Argument in diesem Format erwartet. Aber warum ist das so? Gibt es Einschränkungen hinsichtlich der Möglichkeiten variadischer Funktionen?

Oder sollte ich responder besser in zwei Teile aufteilen, einen für jeden Fall („ok“ und „nicht ok“)?

Siehe auch https://github.com/golang/go/issues/26486 und https://go.dev/src/cmd/vet/testdata/print/print.go (Zeile 316) zur Diskussion des Go-Codes ( Ich habe eine Warnung vom Linter erhalten, wie @mkopriva und @jimb in ihren Kommentaren erwähnt haben)

Problemumgehung

Die Warnung kommt vom Linter aufgrund des Formats, das Sie beim Aufrufen der respond()-Funktion verwenden. Die Zeichenfolge stimmt nicht mit den bereitgestellten Parametern überein später.

Diese spezielle Nachricht kommt vom printf-Analysator, der Folgendes protokolliert:

printf: Überprüfen Sie die Konsistenz der printf-Formatzeichenfolge und -Parameter

Diese Prüfung gilt für Aufrufe von Formatierungsfunktionen wie fmt.printf und fmt.sprintf, sowie für alle erkannten Wrapper für diese Funktionen.

Vielen Dank an Ihren response() 函数使用 formata 参数按原样调用 fmt.sprintf(),因此这被视为 fmt.sprintf() Wrapper.

Wenn Sie diese Warnmeldung vermeiden/beseitigen möchten, besteht die einfachste „Lösung“ darin, diese Parameter nicht unverändert zu verwenden, z. B. einen der Parameter zu kopieren und ihn dann zu übergeben:

// Make and use a copy to avoid being marked as a wrapper of fmt.Sprintf
format := format
message = fmt.Sprintf(format, a...)

Das obige ist der detaillierte Inhalt vonSind Formatierungsanweisungen in variadischen Funktionen erforderlich?. 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