ch5-07 zh2tw

This commit is contained in:
D 2016-01-08 19:09:50 +08:00
parent c49becae58
commit b94cc847f9

View File

@ -1,8 +1,8 @@
## 5.7. 可變參數 ## 5.7. 可變參數
参数数量可变的函数称为为可变参数函数。典型的例子就是fmt.Printf和类似函数。Printf首先接收一个的必备参数之后接收任意个数的后续参数 參數數量可變的函數稱爲爲可變參數函數。典型的例子就是fmt.Printf和類似函數。Printf首先接收一個的必備參數之後接收任意個數的後續參數
声明可变参数函数时,需要在参数列表的最后一个参数类型之前加上省略符号“...”,这表示该函数会接收任意数量的该类型参数 聲明可變參數函數時,需要在參數列表的最後一個參數類型之前加上省略符號“...”,這表示該函數會接收任意數量的該類型參數
```Go ```Go
gopl.io/ch5/sum gopl.io/ch5/sum
@ -14,7 +14,7 @@ func sum(vals...int) int {
return total return total
} }
``` ```
sum函数返回任意个int型参数的和。在函数体中,vals被看作是类型为[] int的切片。sum可以接收任意数量的int型参数 sum函數返迴任意個int型參數的和。在函數體中,vals被看作是類型爲[] int的切片。sum可以接收任意數量的int型參數
```Go ```Go
fmt.Println(sum()) // "0" fmt.Println(sum()) // "0"
@ -22,14 +22,14 @@ fmt.Println(sum(3)) // "3"
fmt.Println(sum(1, 2, 3, 4)) // "10" fmt.Println(sum(1, 2, 3, 4)) // "10"
``` ```
在上面的代码中调用者隐式的创建一个数组并将原始参数复制到数组中再把数组的一个切片作为参数传给被调函数。如果原始参数已经是切片类型我们该如何传递给sum只需在最后一个参数后加上省略符。下面的代码功能与上个例子中最后一条语句相同。 在上面的代碼中調用者隱式的創建一個數組併將原始參數複製到數組中再把數組的一個切片作爲參數傳給被調函數。如果原始參數已經是切片類型我們該如何傳遞給sum隻需在最後一個參數後加上省略符。下面的代碼功能與上個例子中最後一條語句相同。
```Go ```Go
values := []int{1, 2, 3, 4} values := []int{1, 2, 3, 4}
fmt.Println(sum(values...)) // "10" fmt.Println(sum(values...)) // "10"
``` ```
虽然在可变参数函数内部,...int 型参数的行为看起来很像切片类型,但实际上,可变参数函数和以切片作为参数的函数是不同的。 雖然在可變參數函數內部,...int 型參數的行爲看起來很像切片類型,但實際上,可變參數函數和以切片作爲參數的函數是不同的。
```Go ```Go
func f(...int) {} func f(...int) {}
@ -38,7 +38,7 @@ fmt.Printf("%T\n", f) // "func(...int)"
fmt.Printf("%T\n", g) // "func([]int)" fmt.Printf("%T\n", g) // "func([]int)"
``` ```
变参数函数经常被用于格式化字符串。下面的errorf函数构造了一个以行号开头的经过格式化的错误信息。函数名的后缀f是一种通用的命名规范代表该可变参数函数可以接收Printf风格的格式化字符串。 變參數函數經常被用於格式化字符串。下面的errorf函數構造了一個以行號開頭的經過格式化的錯誤信息。函數名的後綴f是一種通用的命名規范代表該可變參數函數可以接收Printf風格的格式化字符串。
```Go ```Go
func errorf(linenum int, format string, args...interface{}) func errorf(linenum int, format string, args...interface{})
@ -52,13 +52,13 @@ errorf(linenum, "undefined: %s", name) // "Line 12:
undefined: count" undefined: count"
``` ```
interfac{}表示函数的最后一个参数可以接收任意类型我们会在第7章详细介绍 interfac{}表示函數的最後一個參數可以接收任意類型我們會在第7章詳細介紹
**练习5.15** 编写类似sum的可变参数函数max和min。考虑不传参时max和min该如何处理再编写至少接收1个参数的版本。 **練習5.15** 編寫類似sum的可變參數函數max和min。考慮不傳參時max和min該如何處理再編寫至少接收1個參數的版本。
**练习5.16**编写多参数版本的strings.Join。 **練習5.16**編寫多參數版本的strings.Join。
**练习5.17**编写多参数版本的ElementsByTagName函数接收一个HTML结点树以及任意数量的标签名返回与这些标签名匹配的所有元素。下面给出了2个例子: **練習5.17**編寫多參數版本的ElementsByTagName函數接收一個HTML結點樹以及任意數量的標籤名返迴與這些標籤名匹配的所有元素。下面給出了2個例子:
```Go ```Go
func ElementsByTagName(doc *html.Node, name...string) func ElementsByTagName(doc *html.Node, name...string)