sprintf函数_三分钟学 Go 语言——函数深度解析(下) 可变参数
接連兩篇函數專題深度解析,相信大家已經對函數的語法有了深入的了解。
- 函數簡單使用和基本知識解析
- 匿名函數和閉包
五一放假期間,我懂得,估計你們都不想學習。
小熊這兩天因為個人種種令人難受的原因,沒有能更新,也沒有提前請假,給大家道歉歉了。
這次小熊給大家帶來了一個函數的特性【可變參數】,作為函數專題的結束。
有沒有發現?
我們有時候會用到的輸出、錯誤輸出、字符串格式化系統函數,你可以傳入任意個數的參數,他全都能處理!
fmt.Println("a","b","c","d")就像一個任勞任怨的老父親,那到底是為什么呢?
因為
因為在go語言中語言級別自帶了一種語法,可以聲明可變參數!
func 函數名(固定參數,v ...T) (返回參數列表){ 函數體 }怎么用?
先和小熊一起試試,寫一個不定參數累加的函數
func sum(t ...int) (res int) {for _, v := range t {res += v}return res } fmt.Println(sum(1, 2, 3, 4, 5))輸出結果
15如果連參數類型都不知道,怎么辦?
上一節我們已知參數類型是int,還記得我們前面說過的switch判斷類型做處理的例子嗎?switch和type switch。
參考這個例子重寫下函數,讓他可以接收任意類型的參數。
func sumNum(t ...interface{}) (res float64){for _,tmp := range t{switch v :=tmp.(type) {case int:res += float64(v)case float64:res+= vcase float32:res += float64(v)}}return res }測試下
fmt.Println(sumNum(1,2.1,"asd",true))因為忽略了輸出
3.1但是上面的例子并沒有覆蓋全部的數字,如果一個一個類型的匹配會瘋掉的。有沒有更好的方法,可以一下子匹配到所有的數字?
func sumNum(t ...interface{}) (res float64) {for _, tmp := range t {switch v := tmp.(type) {case int, int8, int16, int32, int64, uint, uint8, uint16, uint32,uint64, float32, float64, complex64, complex128:convertStr := fmt.Sprintf("%v", v)convertFloat64, _ := strconv.ParseFloat(convertStr, 64)res += convertFloat64}}return res }上面的代碼在case里一下子匹配了所有可能的數字類型,再用格式化輸出轉換成字符串,最后轉換成float64來使用,這是一種折中的辦法,速度可能會比較慢(因為格式化內部邏輯比較復雜消耗速度)。
為了保證速度還是不要省掉一大堆的case,明確了類型再做強轉。
留給你的尋找的答案
有沒有一種只留一個case,同時處理速度又快的方法呢?
—— 愛你們的小熊
總結
以上是生活随笔為你收集整理的sprintf函数_三分钟学 Go 语言——函数深度解析(下) 可变参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript --- 函数的柯
- 下一篇: javascript --- Vue初