0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Go語言可變參數(shù)怎么用能最大化它的效用

馬哥Linux運(yùn)維 ? 來源:博客園 ? 作者:apocelipes ? 2021-09-30 16:33 ? 次閱讀

Go 語言可變參數(shù)怎么用能最大化它的效用?本文對可變參數(shù)進(jìn)行了詳細(xì)介紹。

在實(shí)際開發(fā)中,總有一些函數(shù)的參數(shù)個(gè)數(shù)是在編碼過程中無法確定的,比如我們最常用的 fmt.Printf 和 fmt.Println:

fmt.Printf(“一共有%v 行%v 列、n”, rows, cols)

fmt.Println(“共計(jì)大?。骸保?size)

當(dāng)你需要實(shí)現(xiàn)類似的接口時(shí),就需要我們的可變參數(shù)出場了。

golang 的可變參數(shù)

可變參數(shù)就是一個(gè)占位符,你可以將 1 個(gè)或者多個(gè)參數(shù)賦值給這個(gè)占位符,這樣不管實(shí)際參數(shù)的數(shù)量是多少,都能交給可變參數(shù)來處理,我們看一下可變參數(shù)的聲明:

func Printf(format string, a ...interface{}) (n int, err error)func Println(a ...interface{}) (n int, err error)

可變參數(shù)使用 name ...Type 的形式聲明在函數(shù)的參數(shù)列表中,而且需要是參數(shù)列表的最后一個(gè)參數(shù),這點(diǎn)與其他語言類似;

可變參數(shù)在函數(shù)中將轉(zhuǎn)換為對應(yīng)的 []Type 類型,所以我們可以像使用 slice 時(shí)一樣來獲取傳給函數(shù)的參數(shù)們;

有一點(diǎn)值得注意,golang 的可變參數(shù)不需要強(qiáng)制綁定參數(shù)的出現(xiàn)。

舉個(gè)例子,我想在 c 語言中實(shí)現(xiàn)一個(gè)求和任意個(gè)整數(shù)的函數(shù) sum:

int sum(int num, ...) {

// todo

}

我們只有先指定至少一個(gè)固定的形參(num)才能使用...可變參數(shù),在 golang 中是不需要這樣做的:

func sum(nums ...int) int {

//todo

}

這也是 golang 語法簡潔的其中一個(gè)體現(xiàn)。

傳遞參數(shù)給...可變參數(shù)

傳遞參數(shù)給帶有可變參數(shù)的函數(shù)有兩種形式,第一種與通常的參數(shù)傳遞沒有什么區(qū)別,拿上一節(jié)的 sum 舉個(gè)例子:

sum(1, 2, 3)

sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

除了參數(shù)的個(gè)數(shù)是動(dòng)態(tài)變化的之外和普通的函數(shù)調(diào)用是一致的。

第二種形式是使用...運(yùn)算符以變量...的形式進(jìn)行參數(shù)傳遞,這里的變量必須是與可變參數(shù)類型相同的 slice,而不能是其他類型(沒錯(cuò),數(shù)組也不可以),看個(gè)例子:

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) 等價(jià)

這種形式最常用的地方是在內(nèi)置函數(shù) append 里:

result := []int{1, 3}

data := []int{5, 7, 9}

result = append(result, data.。.) // result == []int{1, 3, 5, 7, 9}

是不是和 python 的解包操作很像,沒錯(cuò),大部分情況下你可以把...運(yùn)算符當(dāng)做是 golang 的 unpack 操作,不過有幾點(diǎn)不同還是要注意的:

第一,只能對 slice 類型使用...運(yùn)算符:

arr := [...]int{1, 2, 3, 4, 5}

sum(arr.。.) // 編譯無法通過

你會(huì)見到這樣的報(bào)錯(cuò)信息cannot use arr (type [5]int) as type []int in argument to sum

這是因?yàn)榭勺儏?shù)實(shí)際是個(gè) slice,... 運(yùn)算符是個(gè)語法糖,它把前面的 slice 直接復(fù)制給可變參數(shù),而不是先解包成獨(dú)立的 n 個(gè)參數(shù)再傳遞,這也是為什么我只說...運(yùn)算符看起來像 unpack 的原因。

第二個(gè)需要注意的地方是不能把獨(dú)立傳參和 ... 運(yùn)算符混用,再看個(gè)例子:

slice := []int{2, 3, 4, 5}

sum(1, slice.。.) // 無法通過編譯

這次你會(huì)見到一個(gè)比較長的報(bào)錯(cuò):

too many arguments in call to sum

have (number, []int.。.)

want (...int)

這是和前面所說的原因是一樣的,... 運(yùn)算符將不定參數(shù)直接替換成了 slice,這樣就導(dǎo)致前一個(gè)獨(dú)立給出的參數(shù)不再算入可變參數(shù)的范圍內(nèi),使得函數(shù)的參數(shù)列表從 (...int) 變成了 (int, ...int),最終使得函數(shù)類型不匹配編譯失敗。

正確的做法也很簡單,不要混合使用...運(yùn)算符給可變參數(shù)傳參即可。

讀了這篇文章,再加上一些簡單的聯(lián)系,我相信你們一定也能掌握 golang 可變參數(shù)的使用。

參考:

https://golang.org/ref/spec#Passing_arguments_to_.。._parameters

https://golang.org/doc/effective_go.html#append

轉(zhuǎn)自:

cnblogs.com/apocelipes/p/9861315.html

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 參數(shù)
    +關(guān)注

    關(guān)注

    11

    文章

    1733

    瀏覽量

    31982
  • 編碼
    +關(guān)注

    關(guān)注

    6

    文章

    920

    瀏覽量

    54711

原文標(biāo)題:Go 可變參數(shù) ... parameters 讀這篇就夠了

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    go語言如何解決并發(fā)問題

    作為一個(gè)后端開發(fā),日常工作中接觸最多的兩門語言就是PHP和GO了。無可否認(rèn),PHP確實(shí)是最好的語言(手動(dòng)狗頭哈哈),寫起來真的很舒爽,沒有任何心智負(fù)擔(dān),字符串和整型壓根就不用區(qū)分,開發(fā)速度真的是比
    的頭像 發(fā)表于 10-23 13:38 ?37次閱讀
    <b class='flag-5'>go</b><b class='flag-5'>語言</b>如何解決并發(fā)問題

    擴(kuò)展塢使用技巧:如何最大化你的筆記本電腦接口能力

    最大化您的筆記本電腦接口能力,以下是一些實(shí)用的擴(kuò)展塢使用技巧: 了解您的需求:在購買擴(kuò)展塢之前,明確您需要哪些類型的端口(如HDMI, USB-C, RJ45等)以及是否需要充電功能,以選擇最適合
    的頭像 發(fā)表于 10-08 10:52 ?134次閱讀

    液冷充電槍線最大化提高充電效率

    法法易提供的液冷充電槍線可以最大化的提升充電效率,讓大家的充電時(shí)間進(jìn)一步縮短。? 液冷充電槍線使用液體循環(huán)來冷卻電纜,以避免因高溫而導(dǎo)致電纜損壞或充電速度減緩。而且液冷充電槍線采用銅芯導(dǎo)線和耐高溫、耐磨損、
    的頭像 發(fā)表于 09-11 14:25 ?249次閱讀

    智慧城市管理系統(tǒng):引領(lǐng)未來城市發(fā)展的創(chuàng)新力量

    智慧城市管理系統(tǒng)是現(xiàn)代城市發(fā)展的關(guān)鍵,通過整合資源、優(yōu)化決策和提升效率,實(shí)現(xiàn)了城市資源的最大化利用和效益最大化。通過大數(shù)據(jù)分析和智能算法,深度挖掘城市運(yùn)行中的各種數(shù)據(jù),精準(zhǔn)預(yù)測和解
    的頭像 發(fā)表于 08-21 11:35 ?168次閱讀
    智慧城市管理系統(tǒng):引領(lǐng)未來城市發(fā)展的創(chuàng)新力量

    三十分鐘入門基礎(chǔ)Go Java小子版

    前言 Go語言定義 Go(又稱 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 開發(fā)的一種靜態(tài)、強(qiáng)類型、編譯型語言
    的頭像 發(fā)表于 08-12 14:32 ?636次閱讀
    三十分鐘入門基礎(chǔ)<b class='flag-5'>Go</b> Java小子版

    fpga的是什么編程語言 fpga什么語言開發(fā)

    和VHDL都是用于邏輯設(shè)計(jì)的硬件描述語言,并且都已成為IEEE標(biāo)準(zhǔn)。它們形式化地抽象表示電路的結(jié)構(gòu)和行為,支持邏輯設(shè)計(jì)中層次與領(lǐng)域的描述,具有電路仿真與驗(yàn)證機(jī)制以保證設(shè)計(jì)的正確性,并便于文檔管理和設(shè)計(jì)重用。 fpga什么
    的頭像 發(fā)表于 03-14 17:09 ?3126次閱讀

    C語言中的可變參數(shù)介紹

    C 語言為這種情況提供了一個(gè)解決方案,允許您定義一個(gè)函數(shù),根據(jù)具體的需求接受可變數(shù)量的參數(shù)
    發(fā)表于 02-28 14:00 ?252次閱讀
    C<b class='flag-5'>語言</b>中的<b class='flag-5'>可變</b><b class='flag-5'>參數(shù)</b>介紹

    GPT寫個(gè)mexFunction

    最近有位用戶想在 MATLAB 里 m 代碼實(shí)現(xiàn)一個(gè)將某個(gè)圖形窗口最大化顯示的功能,問我們有沒有 MATLAB 函數(shù)支持這個(gè)。
    的頭像 發(fā)表于 01-25 10:10 ?627次閱讀
    <b class='flag-5'>用</b>GPT寫個(gè)mexFunction

    使用GaN HEMT設(shè)備最大化OBCs的功率密度

    隨著電動(dòng)汽車(EVs)的銷售量增長,整車OBC(車載充電器)的性能要求日益提高。原始設(shè)備制造商正在尋求最小化這些組件的尺寸和重量以提高車輛續(xù)航里程。因此,我們將探討如何設(shè)計(jì)、選擇拓?fù)浣Y(jié)構(gòu),以及如何通過GaN HEMT設(shè)備最大化OBCS的功率密度。
    的頭像 發(fā)表于 12-17 11:30 ?947次閱讀
    使用GaN HEMT設(shè)備<b class='flag-5'>最大化</b>OBCs的功率密度

    Go編程語言-你應(yīng)該知道的一切

    Go 編程語言的故事始于 Google,當(dāng)時(shí)三位工程師 Robert Griesemer、Rob Pike 和 Ken Thompson 對 C++ 的復(fù)雜性以及缺乏提供高效編譯和執(zhí)行的簡單語言感到厭倦。
    的頭像 發(fā)表于 12-11 17:37 ?564次閱讀

    Python 不可變對象真的不可變

    在日常的學(xué)習(xí)和工作中,經(jīng)常會(huì)遇到"不可變對象"的問題,但是隨著接觸Python這門語言的時(shí)間越來越多,遇到的坑越來越奇怪。我不禁產(chǎn)生了一個(gè)疑問:不可變對象真的不可變嗎? 我們知道元組就
    的頭像 發(fā)表于 11-03 11:48 ?491次閱讀
    Python 不<b class='flag-5'>可變</b>對象真的不<b class='flag-5'>可變</b>嗎

    Go語言比Python強(qiáng)多少

    1.都說Go語言性能非常強(qiáng)大,那么到底比Python強(qiáng)多少? 為了比較Go語言和Python語言在單線程性能上的差距,我們可以做一個(gè)簡單實(shí)驗(yàn)
    的頭像 發(fā)表于 11-02 14:05 ?483次閱讀
    <b class='flag-5'>Go</b><b class='flag-5'>語言</b>比Python強(qiáng)多少

    如何讓Python和Go互相調(diào)度

    我們曾經(jīng)研究過如何讓Python和Go互相調(diào)度,當(dāng)時(shí)發(fā)現(xiàn),將Go語言寫的模塊打包成動(dòng)態(tài)鏈接庫,就能在Python中進(jìn)行調(diào)度: 優(yōu)劣互補(bǔ)! Python+Go結(jié)合開發(fā)的探討
    的頭像 發(fā)表于 11-02 11:24 ?513次閱讀
    如何讓Python和<b class='flag-5'>Go</b>互相調(diào)度

    如何才能在51系統(tǒng)下使用類似printf這樣的可變參數(shù)的子函數(shù)呢?

    學(xué)習(xí)自己構(gòu)造可變參數(shù)的子函數(shù)使用“...”,做參數(shù)。知道是堆棧傳遞函數(shù)的,但是在keil中仿真怎么都不行。sizeof(*p)發(fā)現(xiàn)51單
    發(fā)表于 10-30 08:27

    怎么設(shè)計(jì)c語言可變參數(shù)函數(shù)?

    怎么設(shè)計(jì)c語言可變參數(shù)函數(shù)
    發(fā)表于 10-27 07:10