Go語(yǔ)言探索 - 6(原創(chuàng))

Go語(yǔ)言基礎(chǔ)系列博客用到的所有示例代碼

在?上一篇文章?中,主要學(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)算:

帶返回值的運(yùn)算

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

返回多個(gè)值

上面也說(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é)果:

值傳遞結(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é)果:

引用傳遞結(jié)果

通過(guò)實(shí)驗(yàn)可以發(fā)現(xiàn),操作指針可以實(shí)現(xiàn)引用傳遞。

Go語(yǔ)言的函數(shù)還有一種形式,叫閉包函數(shù)。這種閉包函數(shù)的優(yōu)點(diǎn)在于可以直接使用函數(shù)內(nèi)的變量,不必申明?;緯鴮懜袷饺缦拢?/p>

閉包函數(shù)格式

關(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ù)

閉包函數(shù)

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

結(jié)果

基于Go語(yǔ)言函數(shù)的特性以及閉包函數(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)成果。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容