首頁 > 軟體

Go語言中函數可變引數(Variadic Parameter)詳解

2022-07-18 14:02:18

基本語法

在Python中,在函數引數不確定數量的情況下,可以使用如下方式動態在函數內獲取引數,args實質上是一個list,而kwargs是一個dict

def myFun(*args, **kwargs):

在Go語言中,也有類似的實現方式,只不過Go中只能實現類似*args的陣列方式,而無法實現**kwargs的方式。實現這種方式,其實也是利用陣列的三個點表達方式,我們這裡來回憶一下。

關於三個點(…)Ellipsis的說明

我們經常在Go中看到這種方式,首先三個點的英文是Ellipsis,翻譯成中文叫做“省略”,可能各位看到這個詞就比較好理解三個點的作用了。在不同的位置上有不同的作用,比如在上述陣列的定義中,省略了陣列長度的宣告,而是根據陣列初始化值來決定。在函數定義中,我們還會看到類似的使用方法,我們再進行詳細的說明。

其實本質上三個點的表達方式就是利用陣列這一特性,實現可變引數。來看一下定義格式:

// arg will be [...]int
func myfunc(arg ...int) {}

// paras will be [...]string
func myfunc(arg, paras ... string) {}

範例一:函數中獲取可變引數

迴圈獲取可變引數,並且將部分arguments傳入子函數

package main

import "fmt"

func myfunc(arg ... string) {
    fmt.Printf("arg type is %Tn", arg)
    for index, value := range arg {
        fmt.Printf("And the index is: %dn", index)
        fmt.Printf("And the value is: %vn", value)
    }
}

func main() {
    myfunc("1st", "2nd", "3rd")
}

對上面的例子進行分析:

可變引數arg型別為[]string

通過for進行迴圈並獲取值

arg type is []string
And the index is: 0
And the value is: 1st
And the index is: 1
And the value is: 2nd
And the index is: 2
And the value is: 3rd

範例二:將切片傳給可變引數

我們在上面程式的基礎上實現一個新的函數mySubFunc,嘗試將切片(Slice)傳遞給該函數

package main

import "fmt"

func myfunc(arg ... string) {
    fmt.Printf("arg type is %Tn", arg)
    for index, value := range arg {
        fmt.Printf("And the index is: %dn", index)
        fmt.Printf("And the value is: %vn", value)
    }

    // Call sub funcation with arguments
    fmt.Printf("Pass arguments: %v to mySubFuncn", arg[1:])
    mySubFunc(arg[1:] ...)
}

func mySubFunc(arg ... string) {
    for index, value := range arg {
        fmt.Printf("SubFunc: And the index is: %dn", index)
        fmt.Printf("SubFunc: And the value is: %vn", value)
    }
}

func main() {
    myfunc("1st", "2nd", "3rd")
}

我們來分析一下這段程式碼:

1.與上面的程式碼大部分邏輯相同,這裡利用切片arg[1:]獲取部分可變引數的值

2.在傳輸給子函數mySubFunc()時,使用了這樣的表達方式mySubFunc(arg[1:] …),這裡補充一下…對於切片用法的說明

… signifies both pack and unpack operator but if three dots are in the tail position, it will unpack a slice.

在末尾位置的三個點會unpack一個切片

範例三:多引數

我們再來看一個多引數的例子

package main

import "fmt"

func myfunc(num int, arg ... int) {
    fmt.Printf("num is %vn", num)
    for _, value := range arg {
        fmt.Printf("arg value is: %dn", value)
    }
}

func main() {
    myfunc(1, 2, 3)
}

來分析一下這個程式碼:

函數引數一個為整型變數num,和可變變數arg

主函數中第一個引數為num,而後面的則儲存於arg中

所以輸出結果如下

num is 1
arg value is: 2
arg value is: 3

到此這篇關於Go語言中函數可變引數(Variadic Parameter)詳解的文章就介紹到這了,更多相關Go 函數可變引數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com