golang如何傳不定參數
golang的可變參數
可變參數就是一個佔位符,你可以將1個或多個參數賦值給這個佔位符,這樣不管實際參數的數量是多少,都能交給可變參數來處
理,我們看一下可變參數的宣告:
func Printf(format string, a ...interface{}) (n int, err error) func Println(a ...interface{}) (n int, err error)
可變參數使用name ...Type的形式宣告在函數的參數列表中,而且需要是參數列表的最後一個參數,這點與其他語言類似;
可變參數在函數中將轉換為對應的[]Type類型,所以我們可以像使用slice時一樣來取得傳給函數的參數們;
有一點值得注意,golang的可變參數不需要強制綁定參數的出現。
舉個例子,我想在c語言中實作一個求和任意個整數的函數sum:
int sum(int num, ...) { // todo }
我們只有先指定至少一個固定的形參(num)才能使用. ..可變參數,在golang中是不需要這樣做的:
func sum(nums ...int) int { //todo }
這也是golang語法簡潔的其中一個體現。
傳遞參數給...可變參數
傳遞參數給有可變參數的函數有兩種形式,第一種與通常的參數傳遞沒有什麼差別,拿上一節的sum舉個例子:
sum(1, 2, 3) sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
除了參數的個數是動態變化的之外和普通的函數呼叫是一致的。
第二種形式是使用...運算子以變數...的形式進行參數傳遞,這裡的變數必須是與可變參數類型相同的slice,而不能是其他類型(沒錯,
數組也不可以),看個例子:
numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} sum(numbers...) // 和sum(1, 2, 3, 4, 5, 6, 7, 8, 9. 10)等价
這種形式最常用的地方是在內建函數append裡:
result := []int{1, 3} data := []int{5, 7, 9} result = append(result, data...) // result == []int{1, 3, 5, 7, 9}
是不是和python的解包操作很像,沒錯,大部分情況下你可以把...運算子當做是golang的unpack操作,不過有幾點不同還是要注意
的:
第一,只能對slice型別使用...運算子:
arr := [...]int{1, 2, 3, 4, 5} sum(arr...) // 编译无法通过
你會見到這樣的報錯訊息:
cannot use arr (type [5]int) as type []int in argument to sum
這是因為可變參數實際上是個slice,...運算子是語法糖,它把前面的slice直接複製給可變參數,而不是先解包成獨立的n個參數再傳
遞,這也是為什麼我只說.. .運算符看起來像unpack的原因。
第二個要注意的地方是不能把獨立傳參和...運算子混用,再看個例子:
slice := []int{2, 3, 4, 5} sum(1, slice...) // 无法通过编译
這次你會見到一個比較長的報錯:
too many arguments in call to sum have (number, []int...) want (...int)
這是和前面所說的原因是一樣的,...運算子將不定參數直接替換成了slice,這樣就導致前一個獨立給出的參數不再算入可變參數的範圍
內,使得函數的參數列表從(...int)變成了(int, ...int),最終使得函數型別不符合編譯失敗。
正確的做法也很簡單,不要混合使用...運算子給可變參數傳參即可。
讀了這篇文章,再加上一些簡單的聯繫,我相信你們一定也能掌握golang可變參數的使用。
以上是golang如何傳不定參數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

OpenSSL,作為廣泛應用於安全通信的開源庫,提供了加密算法、密鑰和證書管理等功能。然而,其歷史版本中存在一些已知安全漏洞,其中一些危害極大。本文將重點介紹Debian系統中OpenSSL的常見漏洞及應對措施。 DebianOpenSSL已知漏洞:OpenSSL曾出現過多個嚴重漏洞,例如:心臟出血漏洞(CVE-2014-0160):該漏洞影響OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻擊者可利用此漏洞未經授權讀取服務器上的敏感信息,包括加密密鑰等。

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

後端學習路徑:從前端轉型到後端的探索之旅作為一名從前端開發轉型的後端初學者,你已經有了nodejs的基礎,...

本文討論了通過go.mod,涵蓋規範,更新和衝突解決方案管理GO模塊依賴關係。它強調了最佳實踐,例如語義版本控制和定期更新。

本文介紹在Debian系統下監控PostgreSQL數據庫的多種方法和工具,助您全面掌握數據庫性能監控。一、利用PostgreSQL內置監控視圖PostgreSQL自身提供多個視圖用於監控數據庫活動:pg_stat_activity:實時展現數據庫活動,包括連接、查詢和事務等信息。 pg_stat_replication:監控複製狀態,尤其適用於流複製集群。 pg_stat_database:提供數據庫統計信息,例如數據庫大小、事務提交/回滾次數等關鍵指標。二、借助日誌分析工具pgBadg
