bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

go語言函數體 go語言%t

淺談Go語言函數與方法的區別

前段時間,我們實驗室用go作為后臺開發語言開發了一個web項目,由于這是自己第一次使用go語言進行開發,在開發過程中,一味著追求完成任務,在編碼的時候沒有太注重性能,雖然勉強實現了功能,但是對go語言的理解還是比較淺顯的。下面來談談自己對go語言中函數與方法的理解。

創新互聯專業為企業提供石河子網站建設、石河子做網站、石河子網站設計、石河子網站制作等企業網站建設、網頁設計與制作、石河子企業網站模板建站服務,十余年石河子做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。

普通函數:

go函數可以返回多個值

值傳遞: 值傳遞是指在調用函數時將實際參數復制一份傳遞到函數中,這樣函數中如果對參數進行修改,將不會影響到實際參數

引用傳遞: 引用傳遞是指在調用函數將實際參數的地址傳遞到函數中,那么在函數中對參數進行的修改,將影響到實際參數。

一般來說go語言函數的 接收者(也就是形參)一般放在函數名后面 ,不能將指針類型的數據直接傳遞,也就是說函數形參如果是值類型,調用者必須使用值作為實參過來,如果函數形參是指針類型,則函數調用者需使用指針作為實參來調用。

普通方法:

接收者是在func關鍵字后面,而不是在函數名稱后面,接收者可以是自己定義的一個類型,這個類型可以是struct、interface,一個方法就是一個包含了接收者的函數,接收者可以是命名類型或者是結構體類型的一個值或者是一個指針。

下面是一個例子來說明方法和函數的區別(重點)

Go語言實踐模式 - 函數選項模式(Functional Options Pattern)

大家好,我是小白,有點黑的那個白。

最近遇到一個問題,因為業務需求,需要對接第三方平臺.

而三方平臺提供的一些HTTP(S)接口都有統一的密鑰生成規則要求.

為此我們封裝了一個獨立的包 xxx-go-sdk 以便維護和對接使用.

其中核心的部分是自定義HTTP Client,如下:

一些平臺會要求appKey/appSecret等信息,所以Client結構體就變成了這樣,這時參數還比較少, 而且是必填的參數,我們可以提供構造函數來明確指定。

看起來很滿足,但是當我們需要增加一個 Timeout 參數來控制超時呢?

或許你會說這還不簡單,像下面一樣再加一個參數唄

那再加些其他的參數呢?那構造函數的參數是不是又長又串,而且每個參數不一定是必須的,有些參數我們又會考慮默認值的問題。

為此,勤勞但尚未致富的 gophers 們使用了總結一種實踐模式

首先提取所有需要的參數到一個獨立的結構體 Options,當然你也可以用 Configs 啥的.

然后為每個參數提供設置函數

這樣我們就為每個參數設置了獨立的設置函數。返回值 func(*Options) 看著有點不友好,我們提取下定義為單個 Option 調整一下代碼

當我們需要添加更多的參數時,只需要在 Options 添加新的參數并添加新參數的設置函數即可。

比如現在要添加新的參數 Timeout

這樣后續不管新增多少參數,只需要新增配置項并添加獨立的設置函數即可輕松擴展,并且不會影響原有函數的參數順序和個數位置等。

至此,每個選項是區分開來了,那么怎么作用到我們的 Client 結構體上呢?

首先,配置選項都被提取到了 Options 結構體重,所以我們需要調整一下 Client 結構體的參數

其次,每一個選項函數返回 Option,那么任意多個就是 ...Option,我們調整一下構造函數 NewClient 的參數形式,改為可變參數,不再局限于固定順序的幾個參數。

然后循環遍歷每個選項函數,來生成Client結構體的完整配置選項。

那么怎么調用呢?對于調用方而已,直接在調用構造函數NewClient()的參數內添加自己需要的設置函數(WithXXX)即可

當需要設置超時參數,直接添加 WithTimeout即可,比如設置3秒的超時

配置選項的位置可以任意設置,不需要受常規的固定參數順序約束。

可以看到,這種實踐模式主要作用于配置選項,利用函數支持的特性來實現的,為此得名 Functional Options Pattern,優美的中國話叫做「函數選項模式」。

最后, 我們總結回顧一下在Go語言中函數選項模式的優缺點

GO語言學習系列八——GO函數(func)的聲明與使用

GO是編譯性語言,所以函數的順序是無關緊要的,為了方便閱讀,建議入口函數 main 寫在最前面,其余函數按照功能需要進行排列

GO的函數 不支持嵌套,重載和默認參數

GO的函數 支持 無需聲明變量,可變長度,多返回值,匿名,閉包等

GO的函數用 func 來聲明,且左大括號 { 不能另起一行

一個簡單的示例:

輸出為:

參數:可以傳0個或多個值來供自己用

返回:通過用 return 來進行返回

輸出為:

上面就是一個典型的多參數傳遞與多返回值

對例子的說明:

按值傳遞:是對某個變量進行復制,不能更改原變量的值

引用傳遞:相當于按指針傳遞,可以同時改變原來的值,并且消耗的內存會更少,只有4或8個字節的消耗

在上例中,返回值 (d int, e int, f int) { 是進行了命名,如果不想命名可以寫成 (int,int,int){ ,返回的結果都是一樣的,但要注意:

當返回了多個值,我們某些變量不想要,或實際用不到,我們可以使用 _ 來補位,例如上例的返回我們可以寫成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來舍棄掉

在參數后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個可變長度的參數

輸出為:

在上例中, strs ...string 中, strs 的實際值是b,c,d,e,這就是一個最簡單的傳遞可變長度的參數的例子,更多一些演變的形式,都非常類似

在GO中 defer 關鍵字非常重要,相當于面相對像中的析構函數,也就是在某個函數執行完成后,GO會自動這個;

如果在多層循環中函數里,都定義了 defer ,那么它的執行順序是先進后出;

當某個函數出現嚴重錯誤時, defer 也會被調用

輸出為

這是一個最簡單的測試了,當然還有更復雜的調用,比如調試程序時,判斷是哪個函數出了問題,完全可以根據 defer 打印出來的內容來進行判斷,非常快速,這種留給你們去實現

一個函數在函數體內自己調用自己我們稱之為遞歸函數,在做遞歸調用時,經常會將內存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調用

本篇重點介紹了GO函數(func)的聲明與使用,下一篇將介紹GO的結構 struct

本文名稱:go語言函數體 go語言%t
網址分享:http://vcdvsql.cn/article32/ddigipc.html

成都網站建設公司_創新互聯,為您提供App設計網站建設外貿建站云服務器用戶體驗網站設計公司

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

成都網頁設計公司