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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

go float64 转int_深挖Go函数之深度解析(下):可变参数

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

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