W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
原文鏈接:https://gopl-zh.github.io/ch5/ch5-07.html
參數(shù)數(shù)量可變的函數(shù)稱(chēng)為可變參數(shù)函數(shù)。典型的例子就是fmt.Printf和類(lèi)似函數(shù)。Printf首先接收一個(gè)必備的參數(shù),之后接收任意個(gè)數(shù)的后續(xù)參數(shù)。
在聲明可變參數(shù)函數(shù)時(shí),需要在參數(shù)列表的最后一個(gè)參數(shù)類(lèi)型之前加上省略符號(hào)“...”,這表示該函數(shù)會(huì)接收任意數(shù)量的該類(lèi)型參數(shù)。
gopl.io/ch5/sum
func sum(vals ...int) int {
total := 0
for _, val := range vals {
total += val
}
return total
}
sum函數(shù)返回任意個(gè)int型參數(shù)的和。在函數(shù)體中,vals被看作是類(lèi)型為[] int的切片。sum可以接收任意數(shù)量的int型參數(shù):
fmt.Println(sum()) // "0"
fmt.Println(sum(3)) // "3"
fmt.Println(sum(1, 2, 3, 4)) // "10"
在上面的代碼中,調(diào)用者隱式的創(chuàng)建一個(gè)數(shù)組,并將原始參數(shù)復(fù)制到數(shù)組中,再把數(shù)組的一個(gè)切片作為參數(shù)傳給被調(diào)用函數(shù)。如果原始參數(shù)已經(jīng)是切片類(lèi)型,我們?cè)撊绾蝹鬟f給sum?只需在最后一個(gè)參數(shù)后加上省略符。下面的代碼功能與上個(gè)例子中最后一條語(yǔ)句相同。
values := []int{1, 2, 3, 4}
fmt.Println(sum(values...)) // "10"
雖然在可變參數(shù)函數(shù)內(nèi)部,...int 型參數(shù)的行為看起來(lái)很像切片類(lèi)型,但實(shí)際上,可變參數(shù)函數(shù)和以切片作為參數(shù)的函數(shù)是不同的。
func f(...int) {}
func g([]int) {}
fmt.Printf("%T\n", f) // "func(...int)"
fmt.Printf("%T\n", g) // "func([]int)"
可變參數(shù)函數(shù)經(jīng)常被用于格式化字符串。下面的errorf函數(shù)構(gòu)造了一個(gè)以行號(hào)開(kāi)頭的,經(jīng)過(guò)格式化的錯(cuò)誤信息。函數(shù)名的后綴f是一種通用的命名規(guī)范,代表該可變參數(shù)函數(shù)可以接收Printf風(fēng)格的格式化字符串。
func errorf(linenum int, format string, args ...interface{}) {
fmt.Fprintf(os.Stderr, "Line %d: ", linenum)
fmt.Fprintf(os.Stderr, format, args...)
fmt.Fprintln(os.Stderr)
}
linenum, name := 12, "count"
errorf(linenum, "undefined: %s", name) // "Line 12: undefined: count"
interface{}表示函數(shù)的最后一個(gè)參數(shù)可以接收任意類(lèi)型,我們會(huì)在第7章詳細(xì)介紹。
練習(xí)5.15: 編寫(xiě)類(lèi)似sum的可變參數(shù)函數(shù)max和min??紤]不傳參時(shí),max和min該如何處理,再編寫(xiě)至少接收1個(gè)參數(shù)的版本。
練習(xí)5.16: 編寫(xiě)多參數(shù)版本的strings.Join。
練習(xí)5.17: 編寫(xiě)多參數(shù)版本的ElementsByTagName,函數(shù)接收一個(gè)HTML結(jié)點(diǎn)樹(shù)以及任意數(shù)量的標(biāo)簽名,返回與這些標(biāo)簽名匹配的所有元素。下面給出了2個(gè)例子:
func ElementsByTagName(doc *html.Node, name...string) []*html.Node
images := ElementsByTagName(doc, "img")
headings := ElementsByTagName(doc, "h1", "h2", "h3", "h4")
![]() | ![]() |
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話(huà):173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: