前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go语言的可变(不定)长参数函数

Go语言的可变(不定)长参数函数

作者头像
sean.liu
发布2022-09-28 13:23:27
8940
发布2022-09-28 13:23:27
举报

一般情况一个函数的传入参数都是固定的,但是有一些函数能传入不定数量的参数(可变长的)。比如c语言中的printf。可以看:《C语言“…”占位符及可变参数函数》 在Go语言中,也有这样的函数。用法类似,也是三个点。

可变参数函数声明

申明方法

代码语言:javascript
复制
func Function(args …Type) {
}

上面的三个点(…)表示args是一个可变参数。在函数Function中,参数args会被当做一个slice来处理的。

例子

代码语言:javascript
复制
// 这个函数可以传入任意数量的整型参数
func sum(nums ...int) {
    fmt.Println(nums)
    total := 0
    for _, num := range nums {
        total += num
    }
    fmt.Println(total)
}

可变参数函数的使用

代码语言:javascript
复制
func main() {
    sum(1, 2)
    sum(1, 2, 3)
}

可变参数的用法和一般的参数一样,只是可以随意的指定参数的个数。

给可变参数函数传递数组

当然,我们的参数可能本来就是一个slice,但是函数不允许传入参数。所以只能反过来,把slice打散传入给函数。

代码语言:javascript
复制
func main() {
    // 如果你需要传入的参数在一个slice中,像下面一样
    // "func(slice...)"把slice打散传入
    nums := []int{1, 2, 3, 4}
    sum(nums...)
}

传参时的类型转换错误

这是我遇到的一个问题,在调用一个可变参数函数的时候。如果我把slice手动使用Function(slice[0],slice[1]) 这样传入,可以编译运行,但是如果我使用Function(slice …)就会爆如下错误。

代码语言:javascript
复制
cannot use args (type []string) as type []interface {} in function argument
相关代码
代码语言:javascript
复制
package main

import (
    "fmt"
    "flag"
)

func main() {
    flag.Parse()
    fmt.Println(flag.Args()...)
}

这是我在stackoverflow找到的问题的原因。(上面你的代码也来自stackoverflow的)

其实,从错误代码中也可以看出来,这是变量类型的问题。[]string[]interface {}类型的问题。估计在使用Function(slice…)这种,打散数组传递时,函数是直接把slice传递进去,而不是像一般的用法那样,单个合并到slice里。string传递给interface{}类型的变量是允许的,但是[]string无法转换成[]interface{}类型。

对此,我们只能手动把[]string类型转换成[]interface{}类型,再传入。

代码语言:javascript
复制
old := flag.Args()
new := make([]interface{}, len(old))
for i, v := range old {
    new[i] = interface{}(v)
}
fmt.Println(new...)

所以,只能写一个循环,把[]string类型转换成[]interface{}类型。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022年9月13日2,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 可变参数函数声明
    • 申明方法
      • 例子
      • 可变参数函数的使用
        • 给可变参数函数传递数组
          • 传参时的类型转换错误
            • 相关代码
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档