iT邦幫忙

2022 iThome 鐵人賽

DAY 26
0
自我挑戰組

跟著 Go 實戰聖經 一起自學 Go系列 第 26

DAY 26 Go 語言 函式 (function) 參數不定函式

  • 分享至 

  • xImage
  •  

昨天介紹在 Go 語言中函式 (function) 的傳回值,那我們今天繼續學習參數不定的函式~~

參數不定函式

參數不定函式(variadic function) 是指函式可以接收數量不確定的參數,所以當無法確定參數要接收多少數量時,便可以使用:

func f(參數名稱 ...型別)

上面的 ... 稱為 打包算符(pack operator) ,打包算符可以讓所有符合型別的引數,都放進此參數名稱,並打包成一個切片,如此一來便成為一個可以接收任意數量,或是可以完全沒有引數的切片。

接收數量不定的引數

範例 1:

package main

import "fmt"

func myFavorite(name ...string) {
    fmt.Println(name)
}

func main(){
    myFavorite("奇犽", "西索")
    myFavorite("佐藤壽也")
    myFavorite()
}

範例 1(執行結果):

[奇犽 西索]
[佐藤壽也]
[]

根據範例 1 裡的 myFavorite() 就是一個參數不定函式。而參數不定函式也可以有其他的參數,但要特別注意一個函式只能有一組數量不定的參數,且此數量不定的參數必須放在最後一個參數。
範例 2:

package main

import "fmt"

func myFavorite(name ...string, age int) {
    fmt.Println(name, age)
}

func main(){
    myFavorite("奇犽", "小傑", 12)
}

範例 2(執行結果):

./main.go:1120:22: can only use ... with final parameter in list
./main.go:1125:36: too many arguments in call to myFavorite
        have (string, string, number)
        want (string, int)

若是沒有將數量不定的參數擺在最後面,會出現錯誤訊息 can only use ... with final parameter in list ,要修正錯誤只需要交換參數位置,如下:

範例 3:

package main

import "fmt"

func myFavorite(age int, name ...string) {
    fmt.Println(name, age)
}

func main(){
    myFavorite(12, "奇犽", "小傑")
}

範例 3(執行結果):

[奇犽 小傑] 12

前面有說到若是參數不定的函式,Go 語言會將其轉成切片,我們根據範例 4 來確認 ...string 是否變成切片 []string ,以及若為切片那他的長度跟容量又各是多少呢?

範例 4:

package main

import "fmt"

func myFavorite(name ...string) {
    fmt.Println(name)
    fmt.Println("len:", len(name), ", cap:", cap(name))
    fmt.Printf("%T\n", name) // 使用 Printf 加上 %T 印出型別
}

func main(){
    myFavorite("奇犽", "小傑")
}

範例 4(執行結果):

[奇犽 小傑]
len: 2 , cap: 2
[]string // 是字串型別的切片

我們若想要將切片當作引數,傳給參數不定的函式,需要使用解包算符將切片解開,就可以一一當引數傳給參數不定的函式。

範例 5:

package main

import "fmt"

func myFavorite(name ...string) {
    fmt.Println(name)
}

func main(){
    name := []string{"奇犽", "小傑"} // 定義一個 name 的字串切片
    myFavorite(name...) // 將 name 用 ... (解包算符)拆解
}

範例 5(執行結果):

[奇犽 小傑]

補充:
只有切片可以使用解包算符,若想將陣列拆解,可以使用 陣列[:]... 語法將其轉成切片,傳入參數不定的函式。

今天就先介紹到參數不定函式,明天再來繼續學習匿名函式,明天見~~


上一篇
DAY 25 Go 語言 函式 (function) 傳回值
下一篇
DAY 27 Go 語言 函式 (function) 匿名函式與閉包
系列文
跟著 Go 實戰聖經 一起自學 Go30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言