• GO 可变参数


    参数数量可变的函数称为为可变参数函数。典型的例子就是fmt.Printf和类似函数。Printf首先接收一个的必备参数,之后接收任意个数的后续参数。

    在声明可变参数函数时,需要在参数列表的最后一个参数类型之前加上省略符号“...”,这表示该函数会接收任意数量的该类型参数。

    gopl.io/ch5/sum

    func sum(vals...int) int {
        total := 0
        for _, val := range vals {
            total += val
        }
        return total
    }
    

    sum函数返回任意个int型参数的和。在函数体中,vals被看作是类型为[] int的切片。sum可以接收任意数量的int型参数:

    fmt.Println(sum())           // "0"
    fmt.Println(sum(3))          // "3"
    fmt.Println(sum(1, 2, 3, 4)) // "10"
    

    在上面的代码中,调用者隐式的创建一个数组,并将原始参数复制到数组中,再把数组的一个切片作为参数传给被调函数。如果原始参数已经是切片类型,我们该如何传递给sum?只需在最后一个参数后加上省略符。下面的代码功能与上个例子中最后一条语句相同。

    values := []int{1, 2, 3, 4}
    fmt.Println(sum(values...)) // "10"
    

    虽然在可变参数函数内部,...int 型参数的行为看起来很像切片类型,但实际上,可变参数函数和以切片作为参数的函数是不同的。

    func f(...int) {}
    func g([]int) {}
    fmt.Printf("%T
    ", f) // "func(...int)"
    fmt.Printf("%T
    ", g) // "func([]int)"
    

    可变参数函数经常被用于格式化字符串。下面的errorf函数构造了一个以行号开头的,经过格式化的错误信息。函数名的后缀f是一种通用的命名规范,代表该可变参数函数可以接收Printf风格的格式化字符串。

    func errorf(linenum int, format string, args ...interface{}) {
        fmt.Fprintf(os.Stderr, "Line %d: ", linenum)
        fmt.Fprintf(os.Stderr, format, args...)
        fmt.Fprintln(os.Stderr)
    }
    linenum, name := 12, "count"
    errorf(linenum, "undefined: %s", name) // "Line 12: undefined: count"
    

    interfac{}表示函数的最后一个参数可以接收任意类型

  • 相关阅读:
    3变量
    2python的第一个程序
    1python语言的基本介绍
    6文字的剪切,复制,移动
    讨厌的Permission denied:adb访问手机目录时,怎么处理Permission denied问题
    adb命令整理(持续整理)
    loadrunner12下载、安装、认证、汉化
    操作系统中堆和栈的区别
    mos管选型
    Office 转 PDF
  • 原文地址:https://www.cnblogs.com/sysnap/p/6860671.html
Copyright © 2020-2023  润新知