可變參數
Go語言支持可變參數,給函數傳參帶來了很大的便利,簡化了slice類型參數傳入。代碼示例,
func main(){
printFunc("name", "age")
printFunc([]string{"name", "age"}...)
}
func printFunc(args ...string){
fmt.Printf("args=%v, type=%T\n", args, args)
}
定義函數的時候,在類型前加三個 . 前綴;調用函數的時候,可以直接傳入多個參數,或者傳入一個slice,slice增加三個 . 後綴。運行結果是,
args=[name age], type=[]string
args=[name age], type=[]string
從數據也可以看出,可變參數對於聲明的函數其實在內部是會被轉爲一個slice的。
錯誤使用的坑
前段時間在開發的時候,經常發現有打出 (MISSING) 這樣的日誌。例如,
下面這段代碼,
func main(){
printLog("error happens. name=%v, age=%v", "name", 20)
}
func printLog(msg string, args ...interface{}){
fmt.Printf(msg, args)
}
但是最終輸出確不符合預期,
error happens. name=[[name 20]], age=%!v(MISSING)
代碼看似沒有問題,但是因爲一個函數會以slice的形式接收一個可變參數,所以printLog1在調用printLog2的時候,如果想透傳可變參數,需要把slice轉爲可變參數,否者會把整個slice當做一個interface{}參數。因此需要把slice再轉爲可變參數,
func main(){
printLog("error happens. name=%v, age=%v", "name", 20)
}
func printLog(msg string, args ...interface{}){
fmt.Printf(msg, args...)
}
輸出,
error happens. name=name, age=20