Go语言中函数可变参数(Variadic Parameter)详解

 更新时间:2022年07月18日 11:22:39   作者:孙琦Ray  
在Python中,在函数参数不确定数量的情况下,可以动态在函数内获取参数。在Go语言中,也有类似的实现方式,本文就来为大家详细讲解一下

基本语法

在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 %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")
}

对上面的例子进行分析:

可变参数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 %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")
}

我们来分析一下这段代码:

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 %v\n", num)
    for _, value := range arg {
        fmt.Printf("arg value is: %d\n", 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 函数可变参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • Go语言中map集合的具体使用

    Go语言中map集合的具体使用

    本文主要介绍了Go语言中map集合的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 深入了解Go的HttpClient超时机制

    深入了解Go的HttpClient超时机制

    在写 Go 的过程中经常对比这Java和GO语言的特性,踩了不少坑,也发现了不少有意思的地方,今天就来聊聊 Go 自带的 HttpClient 的超时机制
    2022-11-11
  • Go语言题解LeetCode705设计哈希集合

    Go语言题解LeetCode705设计哈希集合

    这篇文章主要为大家介绍了Go语言题解LeetCode705设计哈希集合,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言并发编程基础上下文概念详解

    Go语言并发编程基础上下文概念详解

    这篇文章主要为大家介绍了Go语言并发编程基础上下文示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • 一文理解Go 中的可寻址和不可寻址

    一文理解Go 中的可寻址和不可寻址

    如果字典的元素不存在,则返回零值,而零值是不可变对象,如果能寻址问题就大了。而如果字典的元素存在,考虑到 Go 中 map 实现中元素的地址是变化的,这意味着寻址的结果也是无意义的。下面我们就围绕这个话题写一篇文章吧,需要的朋友可以参考一下
    2021-10-10
  • Go语言错误处理异常捕获+异常抛出

    Go语言错误处理异常捕获+异常抛出

    这篇文章主要介绍了Go语言错误处理异常捕获和异常抛出,Go语言的作者认为java等语言的错误处理底层实现较为复杂,就实现了函数可以返回错误类型以及简单的异常捕获,虽然简单但是也非常精妙,大大的提高了运行效率,下文需要的朋友可以参考一下
    2022-02-02
  • 一文带你了解Go语言中的I/O接口设计

    一文带你了解Go语言中的I/O接口设计

    I/O 操作在编程中扮演着至关重要的角色,它涉及程序与外部世界之间的数据交换,下面我们就来简单了解一下Go语言中的 I/O 接口设计吧
    2023-06-06
  • Golang 高效排序数据详情

    Golang 高效排序数据详情

    本文我们介绍了怎么使用 Golang 语言标准库 sort 包排序数据,需要注意的是,除了本文使用的类型之外,其它任意类型只要实现 sort.Interface 的三个方法,都可以调用 sort.Sort() 函数排序数据。
    2021-11-11
  • Go语言使用字符串的几个技巧分享

    Go语言使用字符串的几个技巧分享

    这篇文章中小编将给出一些Go语言在处理字符串方面的技巧,对大家学习Go语言具有一定的参考借鉴价值,下面一起看看吧。
    2016-09-09
  • windows下使用vscode搭建golang环境并调试的过程

    windows下使用vscode搭建golang环境并调试的过程

    这篇文章主要介绍了在windows下使用vscode搭建golang环境并进行调试,主要包括安装方法及环境变量配置技巧,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09

最新评论