GO是編譯性語言,所以函數(shù)的順序是無關(guān)緊要的,為了方便閱讀,建議入口函數(shù) main 寫在最前面,其余函數(shù)按照功能需要進行排列
目前成都創(chuàng)新互聯(lián)公司已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)頁空間、網(wǎng)站改版維護、企業(yè)網(wǎng)站設(shè)計、海豐網(wǎng)站維護等服務(wù),公司將堅持客戶導向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
GO的函數(shù) 不支持嵌套,重載和默認參數(shù)
GO的函數(shù) 支持 無需聲明變量,可變長度,多返回值,匿名,閉包等
GO的函數(shù)用 func 來聲明,且左大括號 { 不能另起一行
一個簡單的示例:
輸出為:
參數(shù):可以傳0個或多個值來供自己用
返回:通過用 return 來進行返回
輸出為:
上面就是一個典型的多參數(shù)傳遞與多返回值
對例子的說明:
按值傳遞:是對某個變量進行復(fù)制,不能更改原變量的值
引用傳遞:相當于按指針傳遞,可以同時改變原來的值,并且消耗的內(nèi)存會更少,只有4或8個字節(jié)的消耗
在上例中,返回值 (d int, e int, f int) { 是進行了命名,如果不想命名可以寫成 (int,int,int){ ,返回的結(jié)果都是一樣的,但要注意:
當返回了多個值,我們某些變量不想要,或?qū)嶋H用不到,我們可以使用 _ 來補位,例如上例的返回我們可以寫成 d,_,f := test(a,b,c) ,我們不想要中間的返回值,可以以這種形式來舍棄掉
在參數(shù)后面以 變量 ... type 這種形式的,我們就要以判斷出這是一個可變長度的參數(shù)
輸出為:
在上例中, strs ...string 中, strs 的實際值是b,c,d,e,這就是一個最簡單的傳遞可變長度的參數(shù)的例子,更多一些演變的形式,都非常類似
在GO中 defer 關(guān)鍵字非常重要,相當于面相對像中的析構(gòu)函數(shù),也就是在某個函數(shù)執(zhí)行完成后,GO會自動這個;
如果在多層循環(huán)中函數(shù)里,都定義了 defer ,那么它的執(zhí)行順序是先進后出;
當某個函數(shù)出現(xiàn)嚴重錯誤時, defer 也會被調(diào)用
輸出為
這是一個最簡單的測試了,當然還有更復(fù)雜的調(diào)用,比如調(diào)試程序時,判斷是哪個函數(shù)出了問題,完全可以根據(jù) defer 打印出來的內(nèi)容來進行判斷,非常快速,這種留給你們?nèi)崿F(xiàn)
一個函數(shù)在函數(shù)體內(nèi)自己調(diào)用自己我們稱之為遞歸函數(shù),在做遞歸調(diào)用時,經(jīng)常會將內(nèi)存給占滿,這是非常要注意的,常用的比如,快速排序就是用的遞歸調(diào)用
本篇重點介紹了GO函數(shù)(func)的聲明與使用,下一篇將介紹GO的結(jié)構(gòu) struct
前段時間,我們實驗室用go作為后臺開發(fā)語言開發(fā)了一個web項目,由于這是自己第一次使用go語言進行開發(fā),在開發(fā)過程中,一味著追求完成任務(wù),在編碼的時候沒有太注重性能,雖然勉強實現(xiàn)了功能,但是對go語言的理解還是比較淺顯的。下面來談?wù)勛约簩o語言中函數(shù)與方法的理解。
普通函數(shù):
go函數(shù)可以返回多個值
值傳遞: 值傳遞是指在調(diào)用函數(shù)時將實際參數(shù)復(fù)制一份傳遞到函數(shù)中,這樣函數(shù)中如果對參數(shù)進行修改,將不會影響到實際參數(shù)
引用傳遞: 引用傳遞是指在調(diào)用函數(shù)將實際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對參數(shù)進行的修改,將影響到實際參數(shù)。
一般來說go語言函數(shù)的 接收者(也就是形參)一般放在函數(shù)名后面 ,不能將指針類型的數(shù)據(jù)直接傳遞,也就是說函數(shù)形參如果是值類型,調(diào)用者必須使用值作為實參過來,如果函數(shù)形參是指針類型,則函數(shù)調(diào)用者需使用指針作為實參來調(diào)用。
普通方法:
接收者是在func關(guān)鍵字后面,而不是在函數(shù)名稱后面,接收者可以是自己定義的一個類型,這個類型可以是struct、interface,一個方法就是一個包含了接收者的函數(shù),接收者可以是命名類型或者是結(jié)構(gòu)體類型的一個值或者是一個指針。
下面是一個例子來說明方法和函數(shù)的區(qū)別(重點)
a, b *string傳入swap函數(shù)內(nèi)部后,使用的是a,b的副本a1,b1, 他們的值是相同的,都是字符串的首字母的地址,當在內(nèi)部交換這兩個值時,函數(shù)結(jié)束后,這兩個值就被銷毀了;如果交換的是這兩個值代表的數(shù)據(jù),函數(shù)結(jié)束后,這兩個地址值被銷毀,但地址指向的字符串數(shù)據(jù)已經(jīng)被修改了,所以可以交換成功。
按數(shù)據(jù)類別有以下幾種數(shù)據(jù)類型:
按存儲方式也有兩大類數(shù)據(jù)類型:
值類型:變量直接存儲值。值類型的數(shù)據(jù)存儲在棧內(nèi)存空間中,棧在函數(shù)調(diào)f返回后,內(nèi)存會被釋放。
引用類型:變量存儲的是一個地址,這個地址存儲最終的值。引用數(shù)據(jù)類型的數(shù)據(jù)存儲在堆內(nèi)存空間中,通過 GC 回收。
函數(shù)調(diào)用時申明的基礎(chǔ)類型均為值傳遞,如int,string,數(shù)組等,數(shù)據(jù)傳入函數(shù)后會重新copy一份,函數(shù)內(nèi)的修改不會影響外面的變量,外部變量的修改也不會影響函數(shù)類的變量。
func main () {
myvar := [ 4 ] string {" test0 ", " test1 ", " test3 ", " test4 "}
go Test (myvar)
for i := 1 ; i
本文題目:go語言引用傳遞的原理 go語言值傳遞
網(wǎng)址分享:http://www.chinadenli.net/article6/dosieig.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、網(wǎng)站維護、全網(wǎng)營銷推廣、手機網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)