4 2 可變引數函式

2021-10-24 13:42:19 字數 3977 閱讀 8264

可變引數函式是一種引數個數可變的函式。

如果函式最後乙個引數被記作...t,這時函式可以接受任意個t型別引數作為最後乙個引數。

請注意只有函式的最後乙個引數才允許是可變的。

func

(slice [

]type, elems ...type)

type

package main

import

("fmt"

)func

find

(num int

, nums ...

int)}if

!found

fmt.

printf

("\n")}

func

main()

在上面程式中func find(num int, nums ...int)中的nums可接受任意數量的引數。在find函式中,引數nums相當於乙個整型切片。

可變引數函式的工作原理是把可變引數轉換為乙個新的切片。以上面程式中的第 22 行為例,find函式中的可變引數是89,90,95find函式接受乙個int型別的可變引數。因此這三個引數被編譯器轉換為乙個int型別切片int int然後被傳入find函式。

在第 10 行,for迴圈遍歷nums切片,如果num在切片中,則列印num的位置。如果num不在切片中,則列印提示未找到該數字。

上面**的輸出值如下,

type of nums is int

89 found at index 0 in [89 90 95]

type of nums is int

45 found at index 2 in [56 67 45 90 109]

type of nums is int

78 not found in [38 56 98]

type of nums is int

87 not found in

在上面程式的第 25 行,find函式僅有乙個引數。我們沒有給可變引數nums ...int傳入任何引數。這也是合法的,在這種情況下nums是乙個長度和容量為0nil切片。

下面例子中,我們給可變引數函式傳入乙個切片,看看會發生什麼。

package main

import

("fmt"

)func

find

(num int

, nums ...

int)}if

!found

fmt.

printf

("\n")}

func

main()

find(89

, nums)

}

在第 23 行中,我們將乙個切片傳給乙個可變引數函式。

這種情況下無法通過編譯,編譯器報出錯誤main.go:23: cannot use nums (type int) as type int in argument to find

為什麼無法工作呢?原因很直接,find 函式的說明如下,

func

find

(num int

, nums ...

int)

由可變引數函式的定義可知,nums ...int意味它可以接受int型別的可變引數。

在上面程式的第 23 行,nums作為可變引數傳入find函式。前面我們知道,這些可變引數引數會被轉換為int型別切片然後在傳入find函式中。但是在這裡nums已經是乙個int型別切片,編譯器試圖在nums基礎上再建立乙個切片,像下面這樣

find(89

,[]int

)

這裡之所以會失敗是因為nums是乙個int型別 而不是int型別。

那麼有沒有辦法給可變引數函式傳入切片引數呢?答案是肯定的。

有乙個可以直接將切片傳入可變引數函式的語法糖,你可以在在切片後加上...字尾。如果這樣做,切片將直接傳入函式,不再建立新的切片

在上面的程式中,如果你將第 23 行的find(89, nums)替換為find(89, nums...),程式將成功編譯並有如下輸出

type of nums is int

89 found at index 0 in [89 90 95]

下面是完整的程式供您參考。

package main

import

("fmt"

)func

find

(num int

, nums ...

int)}if

!found

fmt.

printf

("\n")}

func

main()

find(89

, nums...

)}

當你修改可變引數函式中的切片時,請確保你知道你正在做什麼。

下面讓我們來看乙個簡單的例子。

package main

import

("fmt"

)func

change

(s ...

string

)func

main()

change

(welcome...

) fmt.

println

(welcome)

}

你認為這段**將輸出什麼呢?如果你認為它輸出[go world]。恭喜你!你已經理解了可變引數函式和切片。如果你猜錯了,那也不要緊,讓我來解釋下為什麼會有這樣的輸出。

在第 13 行,我們使用了語法糖...並且將切片作為可變引數傳入change函式。

正如前面我們所討論的,如果使用了...welcome切片本身會作為引數直接傳入,不需要再建立乙個新的切片。這樣引數welcome將作為引數傳入change函式

change函式中,切片的第乙個元素被替換成go,這樣程式產生了下面的輸出值

[go world]
這裡還有乙個例子來理解可變引數函式。

package main

import

("fmt"

)func

change

(s ...

string

)func

main()

change

(welcome...

) fmt.

println

(welcome)

}

可變引數函式

c函式要在程式中用到以下這些巨集 void va start va list arg ptr,prev param type va arg va list arg ptr,type void va end va list arg ptr va list 用來儲存巨集va start va arg和v...

可變引數函式

一 什麼是可變引數 我們在c語言程式設計中有時會遇到一些引數個數可變的函式,例如printf 函式,其函式原型為 int printf const char format,它除了有乙個引數format固定以外,後面跟的引數的個數和型別是可變的 用三個點 做引數佔位符 實際呼叫時可以有以下的形式 pr...

可變引數函式

stdarg.h是 c語言中c標準函式庫的 標頭檔案,stdarg是由standard 標準 arguments 引數 簡化而來,主要目的為讓函式能夠接收可變引數。stdarg.h 資料型別 型別名稱 描述 va list 用來儲存巨集va arg與巨集va end所需資訊 巨集名稱 描述va st...