日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

sprintf函数_三分钟学 Go 语言——函数深度解析(下) 可变参数

發布時間:2023/12/10 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 语言——函数深度解析(下) 可变参数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。