Go語(yǔ)言中函數(shù)可變參數(shù)(Variadic Parameter)詳解
基本語(yǔ)法
在Python中,在函數(shù)參數(shù)不確定數(shù)量的情況下,可以使用如下方式動(dòng)態(tài)在函數(shù)內(nèi)獲取參數(shù),args實(shí)質(zhì)上是一個(gè)list,而kwargs是一個(gè)dict
def myFun(*args, **kwargs):
在Go語(yǔ)言中,也有類似的實(shí)現(xiàn)方式,只不過(guò)Go中只能實(shí)現(xiàn)類似*args的數(shù)組方式,而無(wú)法實(shí)現(xiàn)**kwargs的方式。實(shí)現(xiàn)這種方式,其實(shí)也是利用數(shù)組的三個(gè)點(diǎn)表達(dá)方式,我們這里來(lái)回憶一下。
關(guān)于三個(gè)點(diǎn)(…)Ellipsis的說(shuō)明
我們經(jīng)常在Go中看到這種方式,首先三個(gè)點(diǎn)的英文是Ellipsis,翻譯成中文叫做“省略”,可能各位看到這個(gè)詞就比較好理解三個(gè)點(diǎn)的作用了。在不同的位置上有不同的作用,比如在上述數(shù)組的定義中,省略了數(shù)組長(zhǎng)度的聲明,而是根據(jù)數(shù)組初始化值來(lái)決定。在函數(shù)定義中,我們還會(huì)看到類似的使用方法,我們?cè)龠M(jìn)行詳細(xì)的說(shuō)明。
其實(shí)本質(zhì)上三個(gè)點(diǎn)的表達(dá)方式就是利用數(shù)組這一特性,實(shí)現(xiàn)可變參數(shù)。來(lái)看一下定義格式:
// arg will be [...]int
func myfunc(arg ...int) {}
// paras will be [...]string
func myfunc(arg, paras ... string) {}
示例一:函數(shù)中獲取可變參數(shù)
循環(huán)獲取可變參數(shù),并且將部分arguments傳入子函數(shù)
package main
import "fmt"
func myfunc(arg ... string) {
fmt.Printf("arg type is %T\n", arg)
for index, value := range arg {
fmt.Printf("And the index is: %d\n", index)
fmt.Printf("And the value is: %v\n", value)
}
}
func main() {
myfunc("1st", "2nd", "3rd")
}
對(duì)上面的例子進(jìn)行分析:
可變參數(shù)arg類型為[]string
通過(guò)for進(jìn)行循環(huán)并獲取值
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
示例二:將切片傳給可變參數(shù)
我們?cè)谏厦娉绦虻幕A(chǔ)上實(shí)現(xiàn)一個(gè)新的函數(shù)mySubFunc,嘗試將切片(Slice)傳遞給該函數(shù)
package main
import "fmt"
func myfunc(arg ... string) {
fmt.Printf("arg type is %T\n", arg)
for index, value := range arg {
fmt.Printf("And the index is: %d\n", index)
fmt.Printf("And the value is: %v\n", value)
}
// Call sub funcation with arguments
fmt.Printf("Pass arguments: %v to mySubFunc\n", arg[1:])
mySubFunc(arg[1:] ...)
}
func mySubFunc(arg ... string) {
for index, value := range arg {
fmt.Printf("SubFunc: And the index is: %d\n", index)
fmt.Printf("SubFunc: And the value is: %v\n", value)
}
}
func main() {
myfunc("1st", "2nd", "3rd")
}
我們來(lái)分析一下這段代碼:
1.與上面的代碼大部分邏輯相同,這里利用切片arg[1:]獲取部分可變參數(shù)的值
2.在傳輸給子函數(shù)mySubFunc()時(shí),使用了這樣的表達(dá)方式mySubFunc(arg[1:] …),這里補(bǔ)充一下…對(duì)于切片用法的說(shuō)明
… signifies both pack and unpack operator but if three dots are in the tail position, it will unpack a slice.
在末尾位置的三個(gè)點(diǎn)會(huì)unpack一個(gè)切片
示例三:多參數(shù)
我們?cè)賮?lái)看一個(gè)多參數(shù)的例子
package main
import "fmt"
func myfunc(num int, arg ... int) {
fmt.Printf("num is %v\n", num)
for _, value := range arg {
fmt.Printf("arg value is: %d\n", value)
}
}
func main() {
myfunc(1, 2, 3)
}
來(lái)分析一下這個(gè)代碼:
函數(shù)參數(shù)一個(gè)為整型變量num,和可變變量arg
主函數(shù)中第一個(gè)參數(shù)為num,而后面的則存儲(chǔ)于arg中
所以輸出結(jié)果如下
num is 1
arg value is: 2
arg value is: 3
到此這篇關(guān)于Go語(yǔ)言中函數(shù)可變參數(shù)(Variadic Parameter)詳解的文章就介紹到這了,更多相關(guān)Go 函數(shù)可變參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入了解Go的HttpClient超時(shí)機(jī)制
在寫(xiě)?Go?的過(guò)程中經(jīng)常對(duì)比這Java和GO語(yǔ)言的特性,踩了不少坑,也發(fā)現(xiàn)了不少有意思的地方,今天就來(lái)聊聊?Go?自帶的?HttpClient?的超時(shí)機(jī)制2022-11-11
Go語(yǔ)言題解LeetCode705設(shè)計(jì)哈希集合
這篇文章主要為大家介紹了Go語(yǔ)言題解LeetCode705設(shè)計(jì)哈希集合,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
Go語(yǔ)言并發(fā)編程基礎(chǔ)上下文概念詳解
這篇文章主要為大家介紹了Go語(yǔ)言并發(fā)編程基礎(chǔ)上下文示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
一文帶你了解Go語(yǔ)言中的I/O接口設(shè)計(jì)
I/O?操作在編程中扮演著至關(guān)重要的角色,它涉及程序與外部世界之間的數(shù)據(jù)交換,下面我們就來(lái)簡(jiǎn)單了解一下Go語(yǔ)言中的?I/O?接口設(shè)計(jì)吧2023-06-06
windows下使用vscode搭建golang環(huán)境并調(diào)試的過(guò)程
這篇文章主要介紹了在windows下使用vscode搭建golang環(huán)境并進(jìn)行調(diào)試,主要包括安裝方法及環(huán)境變量配置技巧,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09

