首頁  >  文章  >  後端開發  >  可變參數函數中是否需要格式化指令?

可變參數函數中是否需要格式化指令?

WBOY
WBOY轉載
2024-02-09 14:40:091153瀏覽

可變參數函數中是否需要格式化指令?

在PHP中,可變參數函數是一種非常方便的功能,允許我們在函數定義中使用不定數量的參數。然而,是否需要在可變參數函數中使用格式化指令則取決於特定的需求。格式化指令通常用於將參數以特定的格式輸出或處理,例如使用printf()函數時需要指定格式化字串。如果在可變參數函數中需要對參數進行格式化操作,那麼當然是需要使用格式化指令的。但如果只是簡單地將參數傳遞給其他函數或進行一些基本的操作,那麼就不需要使用格式化指令了。總之,是否需要在可變參數函數中使用格式化指令,取決於特定的業務需求。

問題內容

我有一個可變參數函數 respond ,它接受幾個位置參數,並在末尾傳播一個 any 切片。根據上下文,函數以不同的方式使用最後一個參數(請注意messagedata 如何根據status 的值而有所不同。):

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,
    })
}

對於下面的調用,我沒有收到任何警告:

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

但是,對於下一個,警告respond 呼叫有參數,但沒有引發格式化指令 (但程式碼按預期運行,personstruct) :

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

以我的業餘眼光來看,看起來可變參數函數希望在末尾有一個格式化字串和該格式的參數。但為什麼會這樣呢?可變參數函數的作用是否有限制?

或我應該更好地將 responder 分成兩部分,每種情況一個(“ok”和“not ok”)?

另請參閱https://github.com/golang/go/issues/26486 和https://go.dev/src/cmd/vet/testdata/print/print.go (第316 行)進行討論go 程式碼中的該訊息(我收到的是來自linter 的警告,正如@mkopriva 和@jimb 在他們的評論中提到的那樣)

解決方法

##警告來自linter ,因為您呼叫

respond() 函數時使用的格式字串與之後提供的參數不符。

此特定訊息來自

printf 分析器 其中記錄了:

printf:檢查 printf 格式字串和參數的一致性

該檢查適用於對格式化函數(例如 fmt.printf 和 fmt.sprintf)的調用,

以及任何檢測到的這些函數的包裝器

由於您的

response() 函數使用formata 參數原樣呼叫fmt.sprintf(),因此這被視為fmt.sprintf() 的包裝器。

如果您想避免/擺脫此警告訊息,最簡單的「修復」是不按原樣使用這些參數,例如複製其中一個參數,然後將其傳遞:

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

以上是可變參數函數中是否需要格式化指令?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除