在PHP中,可變參數函數是一種非常方便的功能,允許我們在函數定義中使用不定數量的參數。然而,是否需要在可變參數函數中使用格式化指令則取決於特定的需求。格式化指令通常用於將參數以特定的格式輸出或處理,例如使用printf()函數時需要指定格式化字串。如果在可變參數函數中需要對參數進行格式化操作,那麼當然是需要使用格式化指令的。但如果只是簡單地將參數傳遞給其他函數或進行一些基本的操作,那麼就不需要使用格式化指令了。總之,是否需要在可變參數函數中使用格式化指令,取決於特定的業務需求。
我有一個可變參數函數 respond
,它接受幾個位置參數,並在末尾傳播一個 any
切片。根據上下文,函數以不同的方式使用最後一個參數(請注意message
和data
如何根據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 呼叫有參數,但沒有引發格式化指令
(但程式碼按預期運行,person
是struct
) :
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 在他們的評論中提到的那樣)
respond() 函數時使用的格式字串與之後提供的參數不符。
printf 分析器 其中記錄了:
printf:檢查 printf 格式字串和參數的一致性該檢查適用於對格式化函數(例如 fmt.printf 和 fmt.sprintf)的調用,
以及任何檢測到的這些函數的包裝器。
由於您的response() 函數使用
format 和
a 參數原樣呼叫
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中文網其他相關文章!