我們知道,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。