c 函式返回空 程式猿學GO 函式

2021-10-17 08:03:35 字數 3736 閱讀 5629

函式是基本的**塊,用於執行乙個任務。

go 語言最少有個 main() 函式。

你可以通過函式來劃分不同功能,邏輯上每個函式執行的是指定的任務。

函式宣告告訴了編譯器函式的名稱,返回型別,和引數。

go 語言標準庫提供了多種可動用的內建的函式。例如,len() 函式可以接受不同型別引數並返回該型別的長度。如果我們傳入的是字串則返回字串的長度,如果傳入的是陣列,則返回陣列中包含的元素個數。

• 函式宣告

在 go 中宣告乙個函式的語法為:

func functionname(parametername type) returntype
函式宣告以關鍵字 func 開頭,後面是函式名字,接著是在 ( 和 ) 之間指定的引數列表,然後是函式的返回型別。指定引數的語法為引數名稱後面跟著引數型別。可以指定任意數量的引數,形式為: (parameter1 type, parameter2 type)。最後是由 以及它們之間的**塊組成的函式體。

在乙個函式中,引數和返回值是可選的。因此下面的語法也是合法的函式宣告:

func functionname()
• 函式的例子

讓我們寫乙個函式,它以單個產品的**和產品數量作為輸入引數,並以總**(單個產品的**與產品數量的乘積)作為返回值。

func calculatebill(price int, num int) int
上面的函式接受兩個 int 型別的輸入引數:price 和 no,並返回 totalprice(price 與 no 的乘積) 。返回值的型別也是 int。

如果連續的引數具有相同的型別,我們可以避免每次都寫出它們的型別,只需要在結束的時候寫一次就可以了,比如:price int, no int 可以寫成:price, no int。 於是上面的函式可以寫成:

func calculatebill(price, no int) int
下面是完整的程式,它呼叫 calculatebill 並計算總**。

package main

import (

"fmt"

)func calculatebill(price, no int) int

func main()

• 多個返回值乙個函式可以返回多個值。讓我們寫乙個函式 rectprops,它接受乙個矩形的長和寬,並返回該矩形的面積和周長。矩形的面積為長與寬的積。周長為長與寬的和的 2 倍。

func rectprops(w float32, h float32) (float32, float32)
如果乙個函式有多個返回值,那麼這些返回值應該用小括號()括起來,比如:func rectprops(length, width float32)(float32, float32) 接受兩個型別為 float32 的引數(length 和 width),並且同樣返回兩個型別為 float32 的返回值。上面程式的輸出為:area 60.480000 perimeter 32.800000

• 具名返回值

可以給乙個函式的返回值指定名字。如果指定了乙個返回值的名字,則可以視為在該函式的第一行中定義了該名字的變數。

上面的 rectprops 函式可以用具名返回值的形式重寫如下:

func rectdprops(length, width float64) (area, perimeter float64)
在上面的函式中,area 和 perimeter 是具名返回值。注意 return 語句沒有指定任何返回值。因為在函式宣告時已經指定 area 和 perimeter 是返回值,在遇到 return 語句時它們會自動從函式中返回。

在go中,有返回值的函式,無論是具名返回值還是普通形式的返回值,函式中必須包含 return 語句。

• 空指示符

在 go 中,下劃線(_)表示空指示符(blank identifier)。它可以用於代替任何型別的任何值。讓我們看看如何使用空指示符。

我們知道上面定義的函式 rectprops 返回矩形的面積(area)和周長(perimeter)。如果我們只需要獲取 area 而想要忽略 perimeter該怎麼辦呢?這時候就可以使用空指示符。

下面的程式僅接收 rectprops 返回的 area:

package main

import (

"fmt"

)func rectprops(length, width float64) (float64, float64)

func main()

在 area, _ := rectprops(10.8, 5.6) 這一行,我們僅僅獲取了 area,而使用空指示符 _ 來忽略第二個返回值(perimeter)。

• 引數傳遞

呼叫函式,可以通過兩種方式來傳遞引數:

1. 值傳遞:值傳遞是指在呼叫函式時將實際引數複製乙份傳遞到函式中,這樣在函式中如果對引數進行修改,將不會影響到實際引數。預設情況下,go 語言使用的是值傳遞,即在呼叫過程中不會影響到實際引數。

2. 引用傳遞是指在呼叫函式時將實際引數的位址傳遞到函式中,那麼在函式中對引數所進行的修改,將影響到實際引數。

引用傳遞指標引數傳遞到函式內,以下是交換函式 swap() 使用了引用傳遞:

/* 定義交換值函式*/

func swap(x *int, y *int)

package main

import "fmt"

func main()

作用域為已宣告識別符號所表示的常量、型別、變數、函式或包在源**中的作用範圍。

go 語言中變數可以在三個地方宣告:

i. 函式內定義的變數稱為區域性變數

ii. 函式外定義的變數稱為全域性變數

iii. 函式定義中的變數稱為形式引數

接下來讓我們具體了解區域性變數、全域性變數和形式引數。

• 區域性變數

在函式體內宣告的變數稱之為區域性變數,它們的作用域只在函式體內,引數和返回值變數也是區域性變數。

以下例項中 main() 函式使用了區域性變數 a, b, c:

package main

import "fmt"

func main()

• 全域性變數在函式體外宣告的變數稱之為全域性變數,全域性變數可以在整個包甚至外部包(被匯出後)使用。

全域性變數可以在任何函式中使用,以下例項演示了如何使用全域性變數:

package main

import "fmt"

/* 宣告全域性變數 */

var g int

func main()

go 語言程式中全域性變數與區域性變數名稱可以相同,但是函式內的區域性變數會被優先考慮。例項如下:

package main

import "fmt"

/* 宣告全域性變數 */

var g int = 20

func main()

Go返回匿名函式和Defer

go中有return func param1 paramtype1,param2 paramtype2,param paramtype returntype1,returntype2,返回乙個匿名函式的指標,我們在列印時可以列印出這個函式的位址。也可以通過返回值呼叫這個方法。舉例說明 type an...

c 函式返回引用

1 什麼是引用?引用就是變數的別名,操作乙個變數的引用也就相當於操作變數本身,這一點跟指標很類似,但是操作引用不用像操作指標一樣,利用取位址符號,很不方便。而操作引用的話,則跟操作普通變數一樣,所以c 之中更加鼓勵使用引用。2 c 函式為什麼要使用引用?c語言之中大量利用指標作為形參或者函式返回值,...

C 函式返回引用

首先需要明白 c 函式為什麼要返回引用?答 這樣就不用返回結果的副本。因為返回副本需要做賦值拷貝函式,浪費時間。這時候,實際上,返回是結果的副本,而不是結果本身。如果要返回本身,就返回引用就ok了。例1 const string manip2 const string s 此時,返回的不是ret本身...