Go語言 可變引數

2021-10-05 00:02:13 字數 2755 閱讀 8434

最近與同事討論時,提到go語言的可變引數,之前沒有總結過相關知識點,今天我們介紹一下go語言的可變引數。

可變引數variable parameters):引數數量可變的函式稱之為可變引數函式,主要是在使用語法糖syntactic sugar)。最經典的例子就是fmt.printf()和類似的函式,fmt.printf首先接收乙個引數,後面可接收若干個引數。

在開始go語言例項之前,我們先看一下在c語言裡面是如何實現可變引數的,如示例:

#include #include int sum(int count, ...)

//釋放list,釋放後list置為空。

va_end(list);

return sum;

}int main()

執行結果:

我們可以看到,在c語言裡面,需要指定引數個數和若干個引數,下面我們介紹一下go語言中的實現。

例項一:

func1使用的是go語言的語法糖,按照內部機制來說,...type本質是乙個切片,也就是type,params被看作是型別為 int的切片傳入func1中,func1可接收任意個int值,返回sum結果。

雖然在可變引數函式內部,...int型引數的行為看起來類似slice,實際上,可變引數函式和切片作為引數的函式是不相同的。

// 可變引數

func func1(params ...int)

fmt.println("params : ", params, "\tsum : ", sum)

}

呼叫一:

func testfunc1(t *testing.t) 

func1(params...)

func1(2, 5)

func1(2, 5, 8)

}

結果一:

=== run   testfunc1

params : [1 2 3] sum : 6

params : [2 5] sum : 7

params : [2 5 8] sum : 15

--- pass: testfunc1 (0.00s)

例項二:func2雖然同樣實現了不定引數的功能,但是使用起來比較繁瑣,需要type{}來構造切片例項。我們可以看到傳遞的資料是slice,但是在引數傳遞的時候,我們需要手工初始化slice再傳入函式。

// 切片

func func2(params int)

fmt.println("params : ", params, "\tsum : ", sum)

}

呼叫二:

func testfunc2(t *testing.t) )

func2(int)

func2(int)

}

結果二:

=== run   testfunc2

params : [3] sum : 3

params : [3 6] sum : 9

params : [3 6 9] sum : 18

--- pass: testfunc2 (0.00s)

綜上兩例,我們可以看出語法糖實現更簡潔方便。

例項三:

我們再看一下可變型別的可變引數,見func3:

// 可變型別的可變引數

func func3(params ...inte***ce{})

}}

呼叫三:

func testfunc3(t *testing.t)  //傳遞func

func3(p7)

var p8 = map[string]string{} 傳遞map

func3(p8)

}

結果三:

=== run   testfunc3

param:100 is an int value!

param:200 is an int32 value!

param:300 is an int64 value!

param:test string is an string value!

param:1.11 is an float32 value!

param:2.22 is an float64 value!

param:0x506b50 is an func value!

param:map is an map value!

--- pass: testfunc3 (0.00s)

pass

總結:可變引數,主要是go語言的語法糖之"...type"的使用。

引數個數靈活。

go 可變引數

0個或多個引數 func add arg int int 1個或多個引數 func add a int,arg int int 2個或多個引數 func add a int,b int,arg int int 注意 其中arg是乙個slice,我們可以通過arg index 依次訪問所有引數,通過l...

go語言可變引數的坑

對可變引數不了解的同學,可以先看這篇文章可變引數終極指南 不能通過空介面型別向可變引數傳遞乙個普通的切片,需要將普通切片轉換為空介面切片 可變引數不支援確定引數和slice解包的混合。package main func demo args inte ce func main arg3 inte ce...

日常 Go語言聖經 可變引數習題

1.引數數量可變的函式稱為為可變引數函式,例子就是fmt.printf和類似函式 2.引數列表的最後乙個引數型別之前加上省略符號 3.雖然在可變引數函式內部,int 型引數的行為看起來很像切片型別,但實際上,可變引數函式和以切片作為引數的函式是不同的 型別不同 fmt.printf t n f 4....