golang中的可變參數可以讓函數接受任意數量的參數,這為函數的設計和調用帶來了極大的靈活性。本文將從golang函數參數默認值、golang參數默認值、golang函數參數、golang可選參數、golang main參數、golang變長參數、golang參數傳遞、golang切片作為參數這幾個方面來詳細闡述golang可變參數。
一、golang函數參數默認值
golang中的函數參數默認值是實現不了的,這主要是為了避免在調用函數時由於參數順序錯亂而導致問題。golang只支持在函數聲明時為每個參數指定類型但不指定初始值,也就是說golang中不存在如下形式的函數聲明:
func example(a int, b string = "default value") { // do something }
換句話說,在golang中我們必須在調用函數時為每個參數都指定一個值,否則編譯器會報錯。
二、golang參數默認值
雖然golang中沒有函數參數默認值這一特性,但是我們可以通過函數重載來達到類似的效果。具體來說,當我們定義一個函數時,可以定義多個具有不同參數個數以及不同參數類型的函數版本,這些函數版本中參數較少的版本可以給不傳遞對應參數的函數調用提供默認值。下面是一個例子:
func example(a int, b string) { // do something } func example(a int) { example(a, "default value") }
在上面的例子中,當我們調用example(1)時,函數example(a int)就會被調用,並且此時函數的參數b會被賦值為”default value”。
三、golang函數參數
golang中的函數參數傳遞是按值傳遞,也就是說函數接收的參數是傳入參數的值的拷貝,而不是傳入參數的引用。因此,在函數內部修改函數參數的值,不會影響傳入函數的參數的值,如下面的例子所示:
func example(a int) { a = 2 } func main() { b := 1 example(b) fmt.PrintLn(b) // 輸出1 }
在上面的例子中,儘管函數example內部將參數a的值修改為2,但是這並不影響main函數中傳入example函數的參數b的值,因為golang中的函數參數傳遞是按值傳遞。
四、golang可選參數
golang中沒有內置的可選參數的概念,但是我們可以通過函數重載或者結構體來實現類似的效果。下面分別介紹這兩種實現方式。
通過函數重載實現:
func example(a []int) { example(a, 1) } func example(a []int, b int) { // do something } func main() { example([]int{1, 2, 3}) // 調用example(a []int, b int) }
在上面的例子中,函數example(a []int)會調用函數example(a []int, b int),並且給參數b傳遞默認值1。
通過結構體實現可選參數:
type ExampleParams struct { A []int B int } func example(params ExampleParams) { // do something } func main() { example(ExampleParams{A: []int{1, 2, 3}, B: 1}) example(ExampleParams{A: []int{1, 2, 3}}) }
在上面的例子中,我們通過結構體ExampleParams來實現可選參數,當我們調用example函數時,可以選擇傳入ExampleParams結構體,並對其中的字段進行賦值,也可以只傳入部分字段,未傳入的字段就會使用默認值。
五、golang main參數
在golang中,main函數有一個默認的參數類型是[]string,也就是一個字符串切片。在我們通過終端運行一個程序時,可以通過在命令行後面添加多個參數,這些參數就會被作為字符切片傳入main函數中。下面是一個例子:
func main() { fmt.Println(os.Args) }
在上面的例子中,我們使用os包獲取命令行參數,並將其輸出。例如我們運行以下命令行:
go run main.go a b c
那麼輸出結果就是:
[./main a b c]
六、golang變長參數
golang中的變長參數類型用…標識,在函數定義時可以為最後一個參數指定變長參數類型。在函數內部,變長參數可以視為一個slice類型的變量,我們可以對其進行遍歷和操作。下面是一個例子:
func example(args ...int) { for _, arg := range args { fmt.Println(arg) } } func main() { example(1, 2, 3) }
在上面的例子中,我們定義了一個函數example,它的最後一個參數類型是…int,這表示它可以接收任意數量的int類型參數。在函數內部,我們直接將變長參數args當做一個slice類型變量來處理,並遍歷其中的每一個元素並輸出。
七、golang參數傳遞
在golang中,函數參數傳遞有兩種方式,分別是按值傳遞和按引用傳遞。前文已經提到,golang中的函數參數傳遞是按值傳遞,但是我們可以使用指針來模擬按引用傳遞。下面是一個例子:
func example(a *int) { *a = 2 } func main() { b := 1 example(&b) fmt.Println(b) // 輸出2 }
在上面的例子中,我們使用指針來傳遞參數b的引用,從而實現了類似於按引用傳遞的效果。
八、golang切片作為參數
在golang中,切片類型是一種引用類型,因此當我們將切片作為函數參數傳遞時,函數接收到的是該切片的引用,也就是說在函數內部修改切片的元素的值,也會影響到函數外部傳遞的切片的值。下面是一個例子:
func example(a []int) { a[0] = 2 } func main() { b := []int{1, 2, 3} example(b) fmt.Println(b) // 輸出[2, 2, 3] }
在上面的例子中,我們將切片b作為參數傳遞給了函數example,函數內部修改了切片的第一個元素的值,這也導致了函數外部切片b的第一個元素的值被修改。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/206380.html