## 可變參數類型
可變參數是指函數傳入的參數個數是可變的,為了做到這點,首先需要將函數定義為可以接受可變參數的類型:
~~~
func myfunc(args ...int) {
for _, arg := range args {
fmt.Println(arg)
}
}
~~~
## 任意類型的可變參數
之前的例子中將可變參數類型約束為 int,如果你希望傳任意類型,可以指定類型為 interface{},下面是Go語言標準庫中 fmt.Printf() 的函數原型:
~~~
func Printf(format string, args ...interface{}) {
// ...
}
~~~
## 遍歷可變參數列表——獲取每一個參數的值
可變參數列表的數量不固定,傳入的參數是一個切片,如果需要獲得每一個參數的具體值時,可以對可變參數變量進行遍歷,參見下面代碼:
~~~
package main
import (
"bytes"
"fmt"
)
// 定義一個函數, 參數數量為0~n, 類型約束為字符串
func joinStrings(slist ...string) string {
// 定義一個字節緩沖, 快速地連接字符串
var b bytes.Buffer
// 遍歷可變參數列表slist, 類型為[]string
for _, s := range slist {
// 將遍歷出的字符串連續寫入字節數組
b.WriteString(s)
}
// 將連接好的字節數組轉換為字符串并輸出
return b.String()
}
func main() {
// 輸入3個字符串, 將它們連成一個字符串
fmt.Println(joinStrings("pig ", "and", " rat"))
fmt.Println(joinStrings("hammer", " mom", " and", " hawk"))
}
~~~
## 獲得可變參數類型——獲得每一個參數的類型
當可變參數為 interface{} 類型時,可以傳入任何類型的值,此時,如果需要獲得變量的類型,可以通過 switch 獲得變量的類型,下面的代碼演示將一系列不同類型的值傳入 printTypeValue() 函數,該函數將分別為不同的參數打印它們的值和類型的詳細描述。
打印類型及值:
~~~
package main
import (
"bytes"
"fmt"
)
func printTypeValue(slist ...interface{}) string {
// 字節緩沖作為快速字符串連接
var b bytes.Buffer
// 遍歷參數
for _, s := range slist {
// 將interface{}類型格式化為字符串
str := fmt.Sprintf("%v", s)
// 類型的字符串描述
var typeString string
// 對s進行類型斷言
switch s.(type) {
case bool: // 當s為布爾類型時
typeString = "bool"
case string: // 當s為字符串類型時
typeString = "string"
case int: // 當s為整型類型時
typeString = "int"
}
// 寫字符串前綴
b.WriteString("value: ")
// 寫入值
b.WriteString(str)
// 寫類型前綴
b.WriteString(" type: ")
// 寫類型字符串
b.WriteString(typeString)
// 寫入換行符
b.WriteString("\n")
}
return b.String()
}
func main() {
// 將不同類型的變量通過printTypeValue()打印出來
fmt.Println(printTypeValue(100, "str", true))
}
~~~
## 在多個可變參數函數中傳遞參數
可變參數變量是一個包含所有參數的切片,如果要將這個含有可變參數的變量傳遞給下一個可變參數函數,可以在傳遞時給可變參數變量后面添加`...`,這樣就可以將切片中的元素進行傳遞,而不是傳遞可變參數變量本身。
下面的例子模擬 print() 函數及實際調用的 rawPrint() 函數,兩個函數都擁有可變參數,需要將參數從 print 傳遞到 rawPrint 中。
可變參數傳遞:
~~~
package main
import "fmt"
// 實際打印的函數
func rawPrint(rawList ...interface{}) {
// 遍歷可變參數切片
for _, a := range rawList {
// 打印參數
fmt.Println(a)
}
}
// 打印函數封裝
func print(slist ...interface{}) {
// 將slist可變參數切片完整傳遞給下一個函數
rawPrint(slist...)
}
func main() {
print(1, 2, 3)
}
~~~
- 1.Go語言前景
- 2.Go語言環境搭建
- 3.Go語言的基本語法
- 3.1變量
- 3.1.1變量聲明
- 3.1.2變量初始化
- 3.1.3多個變量同時賦值
- 3.1.4匿名變量
- 3.1.5變量的作用域
- 3.1.6整型
- 3.1.7浮點類型
- 3.1.8復數
- 3.1.9bool類型
- 3.1.10字符串
- 3.1.11字符類型
- 3.1.12類型轉換
- 3.2常量
- 3.1.1const關鍵字
- 3.2.2模擬枚舉
- 4.Go語言的流程控制
- 4.2循環結構
- 4.3鍵值循環
- 4.4switch語句
- 4.5goto語句
- 4.6break語句
- 4.7continue語句
- 5.Go語言的函數
- 5.1函數聲明
- 5.2函數變量
- 5.3函數類型實現接口
- 5.4閉包
- 5.5可變參數
- 5.6defer(延遲執行語句)
- 5.7處理運行時錯誤
- 5.8宕機(panic)
- 5.9宕機恢復(recover)
- 5.10Test功能測試函數
- 6.Go語言的內置容器
- 6.1數組
- 6.2切片
- 6.3map
- 6.4sync.Map
- 6.5list
- 6.6range
- 7.Go語言的結構體
- 8.Go語言的接口
- 9.Go語言的常用內置包
- 10.Go語言的并發
- 11.Go語言的文件I/O操作
- 12.Go語言的網絡編程
- 13.Go語言的反射
- 14.Go語言的數據庫編程
- 15.Go語言密碼學算法
- 16.Go語言的gin框架
- 17.Go語言的網絡爬蟲
- 18.Go語言的編譯和工具鏈