Golang学习笔记-1.13 可变参数函数

本文系第十三篇Golang语言学习教程

可变参数函数


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

语法


如果函数的最后一个参数被记作...T,那么函数可以接受任意个T类型的参数作为最后一个参数。

声明可变函数


func sum(vals...int) int {  //定义函数sum,vals被看作[]int类型的切片,sum可以接受任意数量的int类型参数
    total := 0
    for _, val := range vals{  //循环 vals 的值
        total += val  //将所有val加起来
    }
    return total  //返回任意个int型参数的和
}

以上程序中,sum函数返回任意个int型参数的vals被看作[]int类型的切片,sum接收任意数量的int型参数。

func main (){
    fmt.Println(sum(1, 3, 5, 7))  // "16"
    fmt.Println(sum(1, 1, 1))     // "3"
    fmt.Println(sum())            // "0"
}

以上程序调用sum函数计算输入值得和。

来写一个在输入整数列表中查看某个整数是否存在的程序:

package main

import "fmt"

func find(num int, nums...int) {  //定义函数find, 接受任意数量的int型参数
    found := false  //首先定义 found 为错
    for i, v := range nums {  //循环 nums 的值
        if v == num {  
            fmt.Println(num, "found at index", i, "in", nums)
            found = true
        }  //如果循环到的值等于 num 参数,则输出位置,并且将found 置为true
    }
    if !found {   
        fmt.Println(num, "is not in", nums)
    }    //如果found 没有被置为true,则表明没有找到, 输出没有找到
}

func main (){
    find(12, 5, 6, 12, 8, 9)
    find(4, 5, 6)
    find(67)
}

在以上程序中,find函数接收任意数量的int型参数。
可变参数函数的工作原理是将可变参数转换为一个新的切片,这是至关重要的。

在以上程序倒数第四行,find函数中可变参数是5, 6, 12, 8, 9,find 函数接收一个类型为int的可变参数。所以这五个参数被编译器转换为一个int类型切片 int []int{5, 6, 12, 8, 9},然后被传入find函数中。

for循环遍历nums切片,如果num在切片中,则输出num位置,如果不在则提示未找到。
以上代码的输出结果为:

12 found at index 2 in [5 6 12 8 9]
4 is not in [5 6]
67 is not in []

find函数仅有一个参数也是合法的,这样的情况下切片nums是一个长度和容量都为0的nil切片。

给可变参数传入切片

之前说可变参数函数的工作原理是将可变参数转换为一个新的切片,那么以正常方式将切片传入可变参数:

    numbers := []int{5, 6, 7, 8}
    find(7, numbers)

find函数规定,find(num int, nums...int),传入的可变参数只能是int类型的参数,所以直接将一个切片传入会报错cannot use numbers (type []int) as type int in argument to find

只需要在最后一个参数后加上省略符,就可以将切片传给find函数:

package main

import "fmt"

func find(num int, nums...int) {  //定义函数find, 接受任意数量的int型参数
    found := false  //首先定义 found 为错
    for i, v := range nums {  //循环 nums 的值
        if v == num {  
            fmt.Println(num, "found at index", i, "in", nums)
            found = true
        }  //如果循环到的值等于 num 参数,则输出位置,并且将found 置为true
    }
    if !found {   
        fmt.Println(num, "is not in", nums)
    }    //如果found 没有被置为true,则表明没有找到, 输出没有找到
}

func main (){
    numbers := []int{5, 6, 7, 8}
    find(7, numbers...)
}

以上为学习Golang 可变函数

你可能感兴趣的:(Golang学习笔记-1.13 可变参数函数)