sprintf函数_三分钟学 Go 语言——函数深度解析(下) 可变参数
接連兩篇函數(shù)專題深度解析,相信大家已經(jīng)對(duì)函數(shù)的語(yǔ)法有了深入的了解。
- 函數(shù)簡(jiǎn)單使用和基本知識(shí)解析
- 匿名函數(shù)和閉包
五一放假期間,我懂得,估計(jì)你們都不想學(xué)習(xí)。
小熊這兩天因?yàn)閭€(gè)人種種令人難受的原因,沒(méi)有能更新,也沒(méi)有提前請(qǐng)假,給大家道歉歉了。
這次小熊給大家?guī)?lái)了一個(gè)函數(shù)的特性【可變參數(shù)】,作為函數(shù)專題的結(jié)束。
有沒(méi)有發(fā)現(xiàn)?
我們有時(shí)候會(huì)用到的輸出、錯(cuò)誤輸出、字符串格式化系統(tǒng)函數(shù),你可以傳入任意個(gè)數(shù)的參數(shù),他全都能處理!
fmt.Println("a","b","c","d")就像一個(gè)任勞任怨的老父親,那到底是為什么呢?
因?yàn)?/h3>
因?yàn)樵趃o語(yǔ)言中語(yǔ)言級(jí)別自帶了一種語(yǔ)法,可以聲明可變參數(shù)!
func 函數(shù)名(固定參數(shù),v ...T) (返回參數(shù)列表){ 函數(shù)體 }怎么用?
先和小熊一起試試,寫一個(gè)不定參數(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,還記得我們前面說(shuō)過(guò)的switch判斷類型做處理的例子嗎?switch和type switch。
參考這個(gè)例子重寫下函數(shù),讓他可以接收任意類型的參數(shù)。
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 }測(cè)試下
fmt.Println(sumNum(1,2.1,"asd",true))因?yàn)楹雎粤溯敵?/p>3.1
但是上面的例子并沒(méi)有覆蓋全部的數(shù)字,如果一個(gè)一個(gè)類型的匹配會(huì)瘋掉的。有沒(méi)有更好的方法,可以一下子匹配到所有的數(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來(lái)使用,這是一種折中的辦法,速度可能會(huì)比較慢(因?yàn)楦袷交瘍?nèi)部邏輯比較復(fù)雜消耗速度)。
為了保證速度還是不要省掉一大堆的case,明確了類型再做強(qiáng)轉(zhuǎn)。
留給你的尋找的答案
有沒(méi)有一種只留一個(gè)case,同時(shí)處理速度又快的方法呢?
—— 愛(ài)你們的小熊
總結(jié)
以上是生活随笔為你收集整理的sprintf函数_三分钟学 Go 语言——函数深度解析(下) 可变参数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: javascript --- 函数的柯
- 下一篇: 各省统计年鉴