首頁  >  文章  >  後端開發  >  具有 3 個不同指標類型的參數(可以為 nil)的 Sprintf。三元運算子不可用,如何避免寫幾十行?

具有 3 個不同指標類型的參數(可以為 nil)的 Sprintf。三元運算子不可用,如何避免寫幾十行?

WBOY
WBOY轉載
2024-02-12 20:20:091140瀏覽

具有 3 个不同指针类型的参数(可以为 nil)的 Sprintf。三元运算符不可用,如何避免写几十行?

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中文網其他相關文章!

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