go float64 转int_深挖Go函数之深度解析(下):可变参数
接連兩篇函數(shù)專題深度解析,相信大家已經(jīng)對函數(shù)的語法有了深入的了解。
- 函數(shù)簡單使用和基本知識解析
- 匿名函數(shù)和閉包
這次給大家?guī)砹艘粋€函數(shù)的特性【可變參數(shù)】,作為函數(shù)專題的結(jié)束。
有沒有發(fā)現(xiàn)?
我們有時候會用到的輸出、錯誤輸出、字符串格式化系統(tǒng)函數(shù),你可以傳入任意個數(shù)的參數(shù),他全都能處理!
fmt.Println("a","b","c","d")就像一個任勞任怨的老父親,那到底是為什么呢?
因為
因為在go語言中語言級別自帶了一種語法,可以聲明可變參數(shù)!
func?函數(shù)名(固定參數(shù),v?...T)?(返回參數(shù)列表){函數(shù)體}怎么用?
先和小熊一起試試,寫一個不定參數(shù)累加的函數(shù)
func?sum(t?...int)?(res?int)?{?for?_,?v?:=?range?t?{??res?+=?v?}?return?res}fmt.Println(sum(1,?2,?3,?4,?5))輸出結(jié)果
15如果連參數(shù)類型都不知道,怎么辦?
上一節(jié)我們已知參數(shù)類型是int,還記得我們前面說過的switch判斷類型做處理的例子嗎?
switch和type switch
。
參考這個例子重寫下函數(shù),讓他可以接收任意類型的參數(shù)。
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但是上面的例子并沒有覆蓋全部的數(shù)字,如果一個一個類型的匹配會瘋掉的。有沒有更好的方法,可以一下子匹配到所有的數(shù)字?
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里一下子匹配了所有可能的數(shù)字類型,再用格式化輸出轉(zhuǎn)換成字符串,最后轉(zhuǎn)換成float64來使用,這是一種折中的辦法,速度可能會比較慢(因為格式化內(nèi)部邏輯比較復(fù)雜消耗速度)。
為了保證速度還是不要省掉一大堆的case,明確了類型再做強轉(zhuǎn)。
留給你的尋找的答案
有沒有一種只留一個case,同時處理速度又快的方法呢?
總結(jié)
以上是生活随笔為你收集整理的go float64 转int_深挖Go函数之深度解析(下):可变参数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统资源统计
- 下一篇: ae预合成快捷键是什么