Go 語言 函數(shù)聲明

2023-03-14 16:53 更新

原文鏈接:https://gopl-zh.github.io/ch5/ch5-01.html


5.1. 函數(shù)聲明

函數(shù)聲明包括函數(shù)名、形式參數(shù)列表、返回值列表(可省略)以及函數(shù)體。

func name(parameter-list) (result-list) {
    body
}

形式參數(shù)列表描述了函數(shù)的參數(shù)名以及參數(shù)類型。這些參數(shù)作為局部變量,其值由參數(shù)調(diào)用者提供。返回值列表描述了函數(shù)返回值的變量名以及類型。如果函數(shù)返回一個無名變量或者沒有返回值,返回值列表的括號是可以省略的。如果一個函數(shù)聲明不包括返回值列表,那么函數(shù)體執(zhí)行完畢后,不會返回任何值。在hypot函數(shù)中:

func hypot(x, y float64) float64 {
    return math.Sqrt(x*x + y*y)
}
fmt.Println(hypot(3,4)) // "5"

x和y是形參名,3和4是調(diào)用時的傳入的實參,函數(shù)返回了一個float64類型的值。 返回值也可以像形式參數(shù)一樣被命名。在這種情況下,每個返回值被聲明成一個局部變量,并根據(jù)該返回值的類型,將其初始化為該類型的零值。 如果一個函數(shù)在聲明時,包含返回值列表,該函數(shù)必須以 return語句結(jié)尾,除非函數(shù)明顯無法運行到結(jié)尾處。例如函數(shù)在結(jié)尾時調(diào)用了panic異?;蚝瘮?shù)中存在無限循環(huán)。

正如hypot一樣,如果一組形參或返回值有相同的類型,我們不必為每個形參都寫出參數(shù)類型。下面2個聲明是等價的:

func f(i, j, k int, s, t string)                 { /* ... */ }
func f(i int, j int, k int,  s string, t string) { /* ... */ }

下面,我們給出4種方法聲明擁有2個int型參數(shù)和1個int型返回值的函數(shù).blank identifier(譯者注:即下文的_符號)可以強調(diào)某個參數(shù)未被使用。

func add(x int, y int) int   {return x + y}
func sub(x, y int) (z int)   { z = x - y; return}
func first(x int, _ int) int { return x }
func zero(int, int) int      { return 0 }

fmt.Printf("%T\n", add)   // "func(int, int) int"
fmt.Printf("%T\n", sub)   // "func(int, int) int"
fmt.Printf("%T\n", first) // "func(int, int) int"
fmt.Printf("%T\n", zero)  // "func(int, int) int"

函數(shù)的類型被稱為函數(shù)的簽名。如果兩個函數(shù)形式參數(shù)列表和返回值列表中的變量類型一一對應(yīng),那么這兩個函數(shù)被認(rèn)為有相同的類型或簽名。形參和返回值的變量名不影響函數(shù)簽名,也不影響它們是否可以以省略參數(shù)類型的形式表示。

每一次函數(shù)調(diào)用都必須按照聲明順序為所有參數(shù)提供實參(參數(shù)值)。在函數(shù)調(diào)用時,Go語言沒有默認(rèn)參數(shù)值,也沒有任何方法可以通過參數(shù)名指定形參,因此形參和返回值的變量名對于函數(shù)調(diào)用者而言沒有意義。

在函數(shù)體中,函數(shù)的形參作為局部變量,被初始化為調(diào)用者提供的值。函數(shù)的形參和有名返回值作為函數(shù)最外層的局部變量,被存儲在相同的詞法塊中。

實參通過值的方式傳遞,因此函數(shù)的形參是實參的拷貝。對形參進行修改不會影響實參。但是,如果實參包括引用類型,如指針,slice(切片)、map、function、channel等類型,實參可能會由于函數(shù)的間接引用被修改。

你可能會偶爾遇到?jīng)]有函數(shù)體的函數(shù)聲明,這表示該函數(shù)不是以Go實現(xiàn)的。這樣的聲明定義了函數(shù)簽名。

package math

func Sin(x float64) float //implemented in assembly language


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號