在?上一篇文章?中,主要學(xué)習(xí)了Go語(yǔ)言的條件判斷語(yǔ)句以及循環(huán)語(yǔ)句,本篇文章主要學(xué)習(xí)Go語(yǔ)言的函數(shù)定義、值傳遞和引用傳遞以及閉包函數(shù)。
函數(shù)是基本的代碼塊,用于執(zhí)行代碼塊內(nèi)的邏輯任務(wù)。Go 語(yǔ)言最少有個(gè) main() 函數(shù)。平時(shí)運(yùn)行代碼看的日志效果就是寫在main方法里面。通過(guò)函數(shù)可以劃分不同的功能(比如 求和 求乘 求差 等等)。邏輯上每個(gè)函數(shù)執(zhí)行的是指定的任務(wù)。
Go 語(yǔ)言跟其他很多語(yǔ)言一樣也提供了自己內(nèi)置的一些函數(shù)。例如,len() 函數(shù)可以接受不同類型參數(shù)并返回該類型的長(zhǎng)度。如果我們傳入的是字符串則返回字符串的長(zhǎng)度,如果傳入的是數(shù)組,則返回?cái)?shù)組中包含的元素個(gè)數(shù)。
Go 語(yǔ)言函數(shù)定義格式:
func function_name( [ parameter list ] ) [ return_types ] { ?
????函數(shù)體 。。。。自己定義的邏輯
}
關(guān)于函數(shù)定義格式的說(shuō)明:
func:告知編譯器, func 關(guān)鍵字聲明的是一個(gè)函數(shù)
function_name:函數(shù)名稱(方法名),函數(shù)名和參數(shù)列表一起構(gòu)成了函數(shù)簽名。
parameter list:參數(shù)列表,參數(shù)就像一個(gè)占位符,當(dāng)函數(shù)被調(diào)用時(shí),你可以將值傳遞給參數(shù),這個(gè)值被稱為實(shí)際參數(shù)。參數(shù)列表指定的是參數(shù)類型、順序、及參數(shù)個(gè)數(shù)。參數(shù)是可選的,也就是說(shuō)函數(shù)也可以不包含參數(shù)。
return_types:返回類型,函數(shù)返回一列值。return_types 是該列值的數(shù)據(jù)類型。有些功能不需要返回值,這種情況下 return_types 不是必須的。
函數(shù)體:函數(shù)定義的代碼集合。里面就是我們編寫的具體邏輯
上一篇的循環(huán)語(yǔ)句有講到乘法表的計(jì)算,這篇文章主要是講的函數(shù),那么通過(guò) 函數(shù) 就可以動(dòng)態(tài)去表達(dá)乘法表:

這里定義的方法按照上面對(duì)函數(shù)格式的說(shuō)法,是沒(méi)有返回值的。函數(shù)上面定義的一般成為形式參數(shù),在函數(shù)里面定義的變量 稱為局部變量。這個(gè)跟Java很像。下面寫一個(gè)有返回值的函數(shù),函數(shù)的功能就是對(duì)兩個(gè)數(shù)進(jìn)行加法運(yùn)算:

值得一提的是,Go語(yǔ)言函數(shù)可以返回多個(gè)不同類型的值,這個(gè)特性比Java拓展性要強(qiáng)。

上面也說(shuō)到了,函數(shù)如果使用參數(shù),這個(gè)變量就可以稱為是函數(shù)的形式參數(shù)。(跟Java一樣) 形參就像定義在函數(shù)體內(nèi)的局部變量。一般來(lái)說(shuō)調(diào)用函數(shù),可以通過(guò)兩種方式來(lái)傳遞參數(shù),這兩種方式分別是:值傳遞和引用傳遞(也是跟Java一樣)
值傳遞:值傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)復(fù)制一份傳到函數(shù)中,這樣在函數(shù)中如果對(duì)參數(shù)進(jìn)行修改,將不會(huì)影響到實(shí)際參數(shù)。
引用傳遞:引用傳遞是指在調(diào)用函數(shù)時(shí)將實(shí)際參數(shù)的地址傳遞到函數(shù)中,那么在函數(shù)中對(duì)參數(shù)所進(jìn)行的修改,將影響到實(shí)際參數(shù)。
默認(rèn)情況下,Go 語(yǔ)言使用的是值傳遞,即函數(shù)在調(diào)用過(guò)程中不會(huì)影響到實(shí)際參數(shù)。對(duì)于這兩種傳遞還是要具體分析一下。
首先來(lái)看值傳遞,我們先定義一個(gè)函數(shù)來(lái)讓其交換值,調(diào)用完交換值以后的方法在打印原值看值有沒(méi)有發(fā)生變化

編譯下看下運(yùn)行結(jié)果:

在調(diào)用過(guò)程以后,不會(huì)影響到實(shí)際參數(shù),這種情況我們一般就稱為值傳遞。這個(gè)實(shí)驗(yàn)情況既然實(shí)現(xiàn)了值傳遞的情況,那想實(shí)現(xiàn)引用傳遞又該如何去思考?既然對(duì)引用傳遞說(shuō)到了地址,那么我們就可以通過(guò)指針進(jìn)行操作。

編譯下看下運(yùn)行結(jié)果:

通過(guò)實(shí)驗(yàn)可以發(fā)現(xiàn),操作指針可以實(shí)現(xiàn)引用傳遞。
Go語(yǔ)言的函數(shù)還有一種形式,叫閉包函數(shù)。這種閉包函數(shù)的優(yōu)點(diǎn)在于可以直接使用函數(shù)內(nèi)的變量,不必申明?;緯鴮懜袷饺缦拢?/p>

關(guān)于閉包比較好的理解是,由函數(shù)和與其相關(guān)的引用環(huán)境組合而成的實(shí)體。閉包只是在形式和表現(xiàn)上像函數(shù),但實(shí)際上不是函數(shù)。函數(shù)是一些可執(zhí)行的代碼,這些代碼在函數(shù)被定義后就確定了,不會(huì)在執(zhí)行時(shí)發(fā)生變化,所以一個(gè)函數(shù)只有一個(gè)實(shí)例。閉包在運(yùn)行時(shí)可以有多個(gè)實(shí)例,不同的引用環(huán)境和相同的函數(shù)組合可以產(chǎn)生不同的實(shí)例。
一個(gè)編程語(yǔ)言需要哪些特性來(lái)支持閉包呢,下面是根據(jù)查的資料列出一些比較重要的條件:
A:函數(shù)可以作為另一個(gè)函數(shù)的返回值或參數(shù),還可以作為一個(gè)變量的值
B:函數(shù)可以嵌套定義
C:可以捕獲引用環(huán)境,并把引用環(huán)境和函數(shù)代碼組成一個(gè)可調(diào)用的實(shí)體
D:允許定義匿名函數(shù)
那么,我們根據(jù)上面關(guān)于閉包的定義以及前面學(xué)到的函數(shù)綜合起來(lái)寫一個(gè)閉包函數(shù)

編碼之后進(jìn)行效果打印:

基于Go語(yǔ)言函數(shù)的特性以及閉包函數(shù),還可以有這樣一些寫法,下面是幾種格式:

本篇文章主要學(xué)習(xí)的是Go語(yǔ)言的函數(shù)定義、函數(shù)書寫格式、值傳遞和引用傳遞以及閉包函數(shù),基本內(nèi)容大概就是這樣。
如果這篇文章對(duì)您有開發(fā)or學(xué)習(xí)上的些許幫助,希望各位看官留下寶貴的star,謝謝。
Ps:著作權(quán)歸作者所有,轉(zhuǎn)載請(qǐng)注明作者, 商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處(開頭或結(jié)尾請(qǐng)?zhí)砑愚D(zhuǎn)載出處,添加原文url地址),文章請(qǐng)勿濫用,也希望大家尊重筆者的勞動(dòng)成果。