php小編子墨在這裡為大家解答一個關於Sprintf函數的問題。有時候我們需要使用Sprintf函數來格式化字串,但是在某些情況下,我們可能會遇到具有三種不同指標類型的參數的情況,而且這些參數可能為nil。在這種情況下,我們無法使用三元運算子來處理,否則程式碼會變得冗長且不易閱讀。那麼,我們該如何避免寫幾十行的冗長程式碼呢?接下來,我將為大家分享一個簡潔的解決方案。
我要使用 sprintf
建立此字串
message := fmt.sprintf("unit %s has a level of %v, but is of category %v", *entity.name, *entity.levelcode, *entity.categorycode)
在實體中,變數是指針,可以是nil
:
name
是 *string
#levelcode
具有 *levelcode
類型categorycode
具有 *categorycode
類型但如果它們有一個值,我想要這個值而不是指標。 (即單元 abc 的層級為零,但屬於管理單元類別)
無論用什麼語言,我都會這樣寫:
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不允許三元運算子。如果我不處理 nil 值,sprintf
將拋出例外。
那麼,我必須這樣開始嗎?
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?
謝謝,在你的幫助下,我成功地建立了該函數。
// 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" } }
這樣稱呼
message := fmt.Sprintf("Unit %s has a Level of %v, but is of %v Category", value(entity.Name), value(entity.LevelCode), value(entity.CategoryCode))
為單一 sprintf
寫五個語句...但它有效。
以上是具有 3 個不同指標類型的參數(可以為 nil)的 Sprintf。三元運算子不可用,如何避免寫幾十行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!