Go可變參數遇到的坑

可變參數

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章