如何聲明支持有默認值的可選參數(shù)的函數(shù)?

我們知道,Go中的函數(shù)是不支持帶默認值的可選參數(shù)的。這是Go語言的設計者為了保證代碼可讀性特意拋棄的功能。那么我們真得無法在Go編程中聲明帶有默認參數(shù)的函數(shù)嗎?

事實上,我們可以利用變長參數(shù)個數(shù)函數(shù)這一特性來(不是十分完美地)模擬默認參數(shù)。比如下面這個例子:

package main

type Image struct {
  width, height int
  bgColor       uint32
}

// bgColor被用做一個默認值為0xFFFFFF的可選參數(shù)
func NewImage(w, h int, bgColor ...uint32) *Image {
  if len(bgColor) > 1 {
    panic("too many arguments")
  }

  var c uint32 = 0xFFFFFF // 默認值
  if len(bgColor) == 1 {
    c = bgColor[0] // 非默認值
  }

  return &Image{width: w, height: h, bgColor: c}
}

func main() {
  image1 := NewImage(100, 100)
  image2 := NewImage(100, 100, 0xFF00FF)
  _, _ = image1, image2

  _ = NewImage(100, 100, 0xFF00FF, 123) // 恐慌
}

這種模擬默認參數(shù)的方法不是很完美,因為此方法常常降低了代碼的可讀性;而且一些錯誤并不能在編譯時刻被及時發(fā)現(xiàn),比如第三個NewImage調用可以編譯通過但是將在運行時刻產(chǎn)生一個恐慌。但是我相信,在某些場合下,這種方法是有用武之地的。

如果使用常規(guī)的方法,我們必須聲明兩個函數(shù),如下所示:

package main

type Image struct {
  width, height int
  bgColor       uint32
}

func NewImageWithBgColor(w, h int, bgColor uint32) *Image {
  return &Image{width: w, height: h, bgColor: bgColor}
}

func NewImage(w, h int) *Image {
  return NewImageWithBgColor(w, h, 0xFFFFFF)
}

func main() {
  image1 := NewImage(100, 100)
  image2 := NewImageWithBgColor(100, 100, 0xFF00FF)
  _, _ = image1, image2
}

常規(guī)方法的可讀性比較高,但是有時候可能會需要很多名稱很長的函數(shù)。


本文首發(fā)在微信Go 101公眾號,歡迎各位轉載本文。Go 101公眾號將盡量在每個工作日發(fā)表一篇原創(chuàng)短文,有意關注者請掃描下面的二維碼。

101-group-qrcode-1.jpg

關于更多Go語言編程中的事實、細節(jié)和技巧,請訪問《Go語言101》官方網(wǎng)站:https://gfw.go101.org。如果官網(wǎng)被墻,請訪問《Go語言101》github項目:https://github.com/golang101/golang101。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容