精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

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

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

Go 語言可變參數怎么用能最大化它的效用?本文對可變參數進行了詳細介紹。

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

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

fmt.Println(“共計大小:”, size)

當你需要實現類似的接口時,就需要我們的可變參數出場了。

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 可變參數的使用。

參考:

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

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

轉自:

cnblogs.com/apocelipes/p/9861315.html

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 參數
    +關注

    關注

    11

    文章

    1785

    瀏覽量

    32086
  • 編碼
    +關注

    關注

    6

    文章

    935

    瀏覽量

    54764

原文標題:Go 可變參數 ... parameters 讀這篇就夠了

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    在學習go語言的過程踩過的坑

    作為一個5年的phper,這兩年公司和個人都在順應技術趨勢,新項目慢慢從php轉向了go語言,從2021年到現在,筆者手上也先后開發了兩個go項目。在學習go
    的頭像 發表于 11-11 09:22 ?110次閱讀

    go語言如何解決并發問題

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

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

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

    如何更好地發揮工業冷水機的最大效用

    在工業制造領域中,工業冷水機作為關鍵的溫度控制設備,對于確保工業生產線的穩定運行、提高產品質量及延長生產設備的壽命起著至關重要的作用。更好地發揮工業冷水機的最大效用,幫助企業和工廠更好地使用工
    的頭像 發表于 09-12 14:52 ?166次閱讀
    如何更好地發揮工業冷水機的<b class='flag-5'>最大</b><b class='flag-5'>效用</b>

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

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

    智慧城市管理系統:引領未來城市發展的創新力量

    智慧城市管理系統是現代城市發展的關鍵,通過整合資源、優化決策和提升效率,實現了城市資源的最大化利用和效益最大化通過大數據分析和智能算法,深度挖掘城市運行中的各種數據,精準預測和解
    的頭像 發表于 08-21 11:35 ?234次閱讀
    智慧城市管理系統:引領未來城市發展的創新力量

    三十分鐘入門基礎Go Java小子版

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

    Go語言中的函數、方法與接口詳解

    Go 沒有類,不過可以為結構體類型定義方法。方法就是一類帶特殊的接收者參數的函數。方法接收者在它自己的參數列表內,位于 func 關鍵字和方法名之間。(非結構體類型也可以定義方法)
    的頭像 發表于 04-23 16:21 ?752次閱讀

    fpga的是什么編程語言 fpga什么語言開發

    和VHDL都是用于邏輯設計的硬件描述語言,并且都已成為IEEE標準。它們形式化地抽象表示電路的結構和行為,支持邏輯設計中層次與領域的描述,具有電路仿真與驗證機制以保證設計的正確性,并便于文檔管理和設計重用。 fpga什么
    的頭像 發表于 03-14 17:09 ?3316次閱讀

    C語言中的可變參數介紹

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

    GPT寫個mexFunction

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

    用于并行采樣的EVADC同步轉換,如何在最大化采樣率的同時最大限度地減少抖動?

    在我的應用程序中,HSPDM 觸發 EVADC 同時對兩個通道進行采樣。 我應該如何配置 EVADC 以最大限度地減少采樣抖動并最大限度地提高采樣率? 在用戶手冊中,提到 SSE=0,USC=0
    發表于 01-18 07:59

    使用go語言實現一個grpc攔截器

    在開發grpc服務時,我們經常會遇到一些通用的需求,比如:日志、鏈路追蹤、鑒權等。這些需求可以通過grpc攔截器來實現。本文使用go語言來實現一個 grpc一元模式(Unary)攔截器,上報鏈路追蹤信息。
    的頭像 發表于 12-18 10:13 ?635次閱讀
    使用<b class='flag-5'>go</b><b class='flag-5'>語言</b>實現一個grpc攔截器

    使用GaN HEMT設備最大化OBCs的功率密度

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

    Go編程語言-你應該知道的一切

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