6. 函數(shù)(Function)

6. 函數(shù)(Function)

函數(shù)是什么?

函數(shù)是一塊執(zhí)行特定任務(wù)的代碼。一個(gè)函數(shù)是在輸入源基礎(chǔ)上,通過(guò)執(zhí)行一系列的算法,生成預(yù)期的輸出。

函數(shù)的聲明

在 Go 語(yǔ)言中,函數(shù)聲明通用語(yǔ)法如下:

func functionname(parametername type) returntype {  
    // 函數(shù)體(具體實(shí)現(xiàn)的功能)
}

函數(shù)的聲明以關(guān)鍵詞 func 開(kāi)始,后面緊跟自定義的函數(shù)名 functionname (函數(shù)名)。函數(shù)的參數(shù)列表定義在 () 之間,返回值的類(lèi)型則定義在之后的 returntype (返回值類(lèi)型)處。聲明一個(gè)參數(shù)的語(yǔ)法采用 參數(shù)名 參數(shù)類(lèi)型 的方式,任意多個(gè)參數(shù)采用類(lèi)似 (parameter1 type, parameter2 type) 即(參數(shù)1 參數(shù)1的類(lèi)型,參數(shù)2 參數(shù)2的類(lèi)型)的形式指定。之后包含在 {} 之間的代碼,就是函數(shù)體。

函數(shù)中的參數(shù)列表和返回值并非是必須的,所以下面這個(gè)函數(shù)的聲明也是有效的

func functionname() {  
    // 譯注: 表示這個(gè)函數(shù)不需要輸入?yún)?shù),且沒(méi)有返回值
}

示例函數(shù)

我們以寫(xiě)一個(gè)計(jì)算商品價(jià)格的函數(shù)為例,輸入?yún)?shù)是單件商品的價(jià)格和商品的個(gè)數(shù),兩者的乘積為商品總價(jià),作為函數(shù)的輸出值。

func calculateBill(price int, no int) int {  
    var totalPrice = price * no // 商品總價(jià) = 商品單價(jià) * 數(shù)量
    return totalPrice // 返回總價(jià)
}

上述函數(shù)有兩個(gè)整型的輸入 priceno,返回值 totalPricepriceno 的乘積,也是整數(shù)類(lèi)型。

如果有連續(xù)若干個(gè)參數(shù),它們的類(lèi)型一致,那么我們無(wú)須一一羅列,只需在最后一個(gè)參數(shù)后添加該類(lèi)型。 例如,price int, no int 可以簡(jiǎn)寫(xiě)為 price, no int,所以示例函數(shù)也可寫(xiě)成

func calculateBill(price, no int) int {  
    var totalPrice = price * no
    return totalPrice
}

現(xiàn)在我們已經(jīng)定義了一個(gè)函數(shù),我們要在代碼中嘗試著調(diào)用它。調(diào)用函數(shù)的語(yǔ)法為 functionname(parameters)。調(diào)用示例函數(shù)的方法如下:

calculateBill(10, 5)

完成了示例函數(shù)聲明和調(diào)用后,我們就能寫(xiě)出一個(gè)完整的程序,并把商品總價(jià)打印在控制臺(tái)上:

package main

import (  
    "fmt"
)

func calculateBill(price, no int) int {  
    var totalPrice = price * no
    return totalPrice
}
func main() {  
    price, no := 90, 6 // 定義 price 和 no,默認(rèn)類(lèi)型為 int
    totalPrice := calculateBill(price, no)
    fmt.Println("Total price is", totalPrice) // 打印到控制臺(tái)上
}

該程序在控制臺(tái)上打印的結(jié)果為

Total price is 540

多返回值

Go 語(yǔ)言支持一個(gè)函數(shù)可以有多個(gè)返回值。我們來(lái)寫(xiě)個(gè)以矩形的長(zhǎng)和寬為輸入?yún)?shù),計(jì)算并返回矩形面積和周長(zhǎng)的函數(shù) rectProps。矩形的面積是長(zhǎng)度和寬度的乘積, 周長(zhǎng)是長(zhǎng)度和寬度之和的兩倍。即:

  • 面積 = 長(zhǎng) * 寬
  • 周長(zhǎng) = 2 * ( 長(zhǎng) + 寬 )
package main

import (  
    "fmt"
)

func rectProps(length, width float64)(float64, float64) {  
    var area = length * width
    var perimeter = (length + width) * 2
    return area, perimeter
}

func main() {  
    area, perimeter := rectProps(10.8, 5.6)
    fmt.Printf("Area %f Perimeter %f", area, perimeter) 
}

如果一個(gè)函數(shù)有多個(gè)返回值,那么這些返回值必須用 () 括起來(lái)。func rectProps(length, width float64)(float64, float64) 示例函數(shù)有兩個(gè) float64 類(lèi)型的輸入?yún)?shù) lengthwidth,并返回兩個(gè) float64 類(lèi)型的值。該程序在控制臺(tái)上打印結(jié)果為

Area 60.480000 Perimeter 32.800000

命名返回值

從函數(shù)中可以返回一個(gè)命名值。一旦命名了返回值,可以認(rèn)為這些值在函數(shù)第一行就被聲明為變量了。

上面的 rectProps 函數(shù)也可用這個(gè)方式寫(xiě)成:

func rectProps(length, width float64)(area, perimeter float64) {  
    area = length * width
    perimeter = (length + width) * 2
    return // 不需要明確指定返回值,默認(rèn)返回 area, perimeter 的值
}

請(qǐng)注意, 函數(shù)中的 return 語(yǔ)句沒(méi)有顯式返回任何值。由于 areaperimeter 在函數(shù)聲明中指定為返回值, 因此當(dāng)遇到 return 語(yǔ)句時(shí), 它們將自動(dòng)從函數(shù)返回。

空白符

_ 在 Go 中被用作空白符,可以用作表示任何類(lèi)型的任何值。

我們繼續(xù)以 rectProps 函數(shù)為例,該函數(shù)計(jì)算的是面積和周長(zhǎng)。假使我們只需要計(jì)算面積,而并不關(guān)心周長(zhǎng)的計(jì)算結(jié)果,該怎么調(diào)用這個(gè)函數(shù)呢?這時(shí),空白符 _ 就上場(chǎng)了。

下面的程序我們只用到了函數(shù) rectProps 的一個(gè)返回值 area

package main

import (  
    "fmt"
)

func rectProps(length, width float64) (float64, float64) {  
    var area = length * width
    var perimeter = (length + width) * 2
    return area, perimeter
}
func main() {  
    area, _ := rectProps(10.8, 5.6) // 返回值周長(zhǎng)被丟棄
    fmt.Printf("Area %f ", area)
}

在程序的 area, _ := rectProps(10.8, 5.6) 這一行,我們看到空白符 _ 用來(lái)跳過(guò)不要的計(jì)算結(jié)果。

?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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