go float64 转int_深挖Go函数之深度解析(下):可变参数
生活随笔
收集整理的這篇文章主要介紹了
go float64 转int_深挖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+=?v??case?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,同時處理速度又快的方法呢?
總結
以上是生活随笔為你收集整理的go float64 转int_深挖Go函数之深度解析(下):可变参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统资源统计
- 下一篇: rapidjson读取json文件_SP