首页 > 其他分享 >可变参数函数

可变参数函数

时间:2024-02-23 14:56:47浏览次数:20  
标签:函数 nums int 参数 可变 found find

目录

一、可变参数函数

1. 概念

  • 可变参数相当于python中定义的函数它的参数中args的功能,用来接收多个参数,而参数中带有可变参数的函数就叫可变参数函数

2. 语法

  • 而Go中可变参数是用 ...T 来表示的,而且只能加在函数参数的最后,表示这个函数可以接收任意个(0到无数个) T 类型的参数作为最后一个参数(即只有函数的最后一个参数才允许时可变的

3. 工作原理

  • 可变参数函数的工作原理是把接收的多余参数全部转换为一个新的切片,再将这个切片当作一个参数传给函数

二、创建一个可变参数函数

创建了一个可变参数函数find ,

package main

import (
    "fmt"
)

func find(num int, nums ...int) {
    fmt.Printf("type of nums is %T\n", nums)
    found := false
    for i, v := range nums {
        if v == num {
            fmt.Println(num, "found at index", i, "in", nums)
            found = true
        }
    }
    if !found {
        fmt.Println(num, "not found in ", nums)
    }
    fmt.Printf("\n")
}
func main() {
    find(89, 89, 90, 95)
    find(45, 56, 67, 45, 90, 109)
    find(78, 38, 56, 98)
    find(87)  // 不给可变参数nums传参
}

/*
这里的 find(89, 89, 90, 95) ,函数中的可变参数 ...int 将 89, 90, 95 编译转换为一个int类型的切片 []int{89, 90, 95} ,然后传给函数find的参数 nums

find(45, 56, 67, 45, 90, 109) ,函数中的可变参数 ...int 将 56, 67, 45, 90, 109 编译转换为一个int类型的切片 []int{56, 67, 45, 90, 109} ,然后传给函数find的参数 nums

这里的 find(87) ,函数中的可变参数 ...int 将 空 编译转换为一个int类型的空切片 []int{} ,然后传给函数find的参数 nums,我们仅传给find 函数一个参数。我们没有给可变参数 nums ...int 传入任何参数。这也是合法的,在这种情况下 nums 是一个长度和容量为 0 的 nil 切片

打印结果:
type of nums is []int
89 found at index 0 in [89 90 95]

type of nums is []int
45 found at index 2 in [56 67 45 90 109]

type of nums is []int
78 not found in  [38 56 98]

type of nums is []int
87 not found in  []

*/

三、给可变参数函数传入切片

1. 错误示范

  • 在二中我们给可变参数传的都属于单个元素,单个元素转换成切片是没有问题的,但是当我们直接给可变参数传入切片会怎么样呢
package main

import (
    "fmt"
)

func find(num int, nums ...int) {
    fmt.Printf("type of nums is %T\n", nums)
    found := false
    for i, v := range nums {
        if v == num {
            fmt.Println(num, "found at index", i, "in", nums)
            found = true
        }
    }
    if !found {
        fmt.Println(num, "not found in ", nums)
    }
    fmt.Printf("\n")
}
func main() {
    nums := []int{89, 90, 95}
    find(89, nums)
}

/*
结果是程序报错了,无法这样传值,main.go:23: cannot use nums (type []int) as type int in argument to find
其实原因很简单,find函数定义的可变参数为 ...int ,意思可以接收int类型的参数,然后将这些int类型参数转化成切片,而我们此时传入的是切片,在转换切片时格式为[]int{nums},这里之所以会失败是因为 nums 是一个 []int类型 而不是 int类型
*/

2. 正确写法

  • 按照上面的错误示范,的确是不能传切片的,但是有没有别的方法能实现呢,答案是肯定的
  • 这个方法就是在传切片的时候,在切片后加上 ... 后缀,这样做之后,切片将直接传入函数,相当于给可变参数带句话,让可变参数不再创建新的切片
  • 这里提醒一句,由于切片的底层数组的关系,当你在函数中修改切片时,请确保你知道你自己在做什么
package main

import (
    "fmt"
)

func find(num int, nums ...int) {
    fmt.Printf("type of nums is %T\n", nums)
    found := false
    for i, v := range nums {
        if v == num {
            fmt.Println(num, "found at index", i, "in", nums)
            found = true
        }
    }
    if !found {
        fmt.Println(num, "not found in ", nums)
    }
    fmt.Printf("\n")
}
func main() {
    my_nums := []int{89, 90, 95}
    find(89, my_nums...)  // 在 切片my_nums 后面加上 ...  即可实现给可变参数传切片
}

标签:函数,nums,int,参数,可变,found,find
From: https://www.cnblogs.com/Mcoming/p/18029521

相关文章

  • 【文化课学习笔记】【数学】函数(上)
    【数学】函数(上)概念【本质】唯一确定的对应。【定义】一般地,设\(A,B\)是非空的实数集,如果对于集合\(A\)中的任意一个数\(x\),按照某种确定的对应关系\(f\),在集合\(B\)中都有唯一确定的数\(y\)和它对应,那么就称\(f:A\toB\)为从集合\(A\)到集合\(B\)的一个函数......
  • linux 中 awk 之 sub、gsub、substr、index、match函数的用法
     001、awk中sub函数的用法:sub用于替换,其语法如下:a、[root@pc1test1]#lsa.txt[root@pc1test1]#cata.txt##测试数据abcdxabcdabcdxyzqmnopqriytyxabcdunyeenabcdkabcdeabcabcabc[root@pc1test1]#awk'{sub("abc","QQQ&......
  • fswatch 使用和参数说明
    常用:fswatch-0./xx/xx  监控./xxx/xxx的文件;每次变更的时候输出fswatch-1./xx/xx   监控./xxx/xxx的文件;只监控一次后,退出fswatchfswatch-o./xx/xx   监控./xxx/xxx的文件;输出一个变更事件数字fswatch-x./xx/xx  监控  ./xxx/xxx的文件;输出变......
  • C++ 第四节课 C和C++指针的区别 C的宏函数和C++内联函数的优缺点
    #include<iostream>//定义一个宏函数#defineADD(x,y)x+y;//宏函数具有速度快等特点但是写代码有些业务比较繁琐,所以C++中使用了内联函数优化//在定义函数前面添加一个inline把这个函数变成内联函数inlineintmax(intx,inty){returnx>y?x:y;}usi......
  • 机械臂EL方程的参数问题
    机器人建模使用的EL方程如下 论文推导需要假设M,v,g的一阶导数有界,为了查证是否假设是合理的,粗略补习下机器人学的知识 其中M由雅各比矩阵和惯性张量组成,由下面几个参考推导可推论,M的导数是有界的。https://blog.csdn.net/weixin_43940314/article/details/123995079https:......
  • Java 构造函数与修饰符详解:初始化对象与控制权限
    Java构造函数Java构造函数是一种特殊的类方法,用于在创建对象时初始化对象的属性。它与类名相同,并且没有返回值类型。构造函数的作用:为对象的属性设置初始值执行必要的初始化操作提供创建对象的多种方式构造函数的类型:默认构造函数:无参数的构造函数,如果用户没有明......
  • Python笔记11——函数
    十一、函数函数的作用:提高模块化程度,提高代码重复利用率。11.1定义一个函数一般格式:def函数名(参数列表):函数体以def关键字开头,后接函数标识符名称和圆括号()。所需参数必须都在圆括号中声明。(默认参数值和参数名称是按函数声明中定义的顺序匹配起来的。)函数内容以......
  • SQL Server中文大写金额转化函数
    SQLServer中文金额、大写金额:CREATEFUNCTIONfn_GetChineseCost(@Costfloat)RETURNSvarchar(50)AS----大写金额----BEGINdeclare@returnStrvarchar(50)if(@Cost>=1000000000)Beginset@returnStr='##########'......
  • 【JAVA】函数式接口示例
     Java的函数式接口提供了更简洁和声明性的方式来处理数据。以下是一些使用Predicate<T>、Function<T,R>、Consumer<T>和Supplier<T>的代码示例 Predicate(谓词语句)importjava.util.function.Predicate;publicclassPredicateExample{publicstaticvoidmain(Str......
  • flink 窗口函数 中文解释和案例
    flink窗口函数中文解释和案例文章目录窗口函数时间语义处理时间事件时间摄入时间水位线有序流中的水位线乱序流中的水位线生成水位线生成水位线原则水位线生成策略flink内置水位线生成器有序流乱序流自定义水位线周期性水位线生成器断点式水位线生成器水位线的传递......