非零基础自学Golang 第7章 函数 7.4 可变参数

非零基础自学Golang

第7章 函数

7.4 可变参数

Go语言支持可变参数的特性,即函数声明时可以没有固定数量的参数。

可变参数的函数格式如下:

func 函数名 (固定参数列表, v ... T) (返回参数列表) {
    函数体
}
  • 可变参数一般放在函数参数列表的末尾,也可不存在固定参数列表。
  • “v …T”代表的其实就是变量v为T类型的切片,v和T之间为三个“.”。
7.4.1 可变参数函数的使用

对于动手写7.1.1,add函数只能对两个int类型的数进行加法计算,现在我们可以使用可变参数实现任意个int类型数的加法运算,最后返回加法结果。

[ 动手写 7.4.1 ]

package main

import "fmt"

func add(slice ...int) int {

   sum := 0
   for _, value := range slice {
      sum = sum + value
   }

   return sum
}

func main() {

   fmt.Println("1+2+...+9+10 = ", add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))

}

运行结果

在这里插入图片描述

在使用可变参数的函数体中,我们常常会使用for循环来对切片中的项进行操作。

7.4.2 可变参数与内置函数

Go语言中许多内置函数的参数都用了可变参数,比如最常用的fmt包中的Println函数和Printf函数。

fmt包中的Println函数源码如下(在GoLand编辑器中,可以将鼠标移到目标函数上,按下ctrl+鼠标左键来跳转到函数定义的代码块),Println函数所有的参数都为可变参数:

// Println formats using the default formats for its operands and writes to standard output.
// Spaces are always added between operands and a newline is appended.
// It returns the number of bytes written and any write error encountered.
func Println(a ...any) (n int, err error) {
   return Fprintln(os.Stdout, a...)
}

在这里插入图片描述

Printf函数源码如下,第一个参数指定了需要打印的格式:

// Printf formats according to a format specifier and writes to standard output.
// It returns the number of bytes written and any write error encountered.
func Printf(format string, a ...any) (n int, err error) {
   return Fprintf(os.Stdout, format, a...)
}

在这里插入图片描述

7.4.3 可变参数的传递

可变参数本质上是一个切片,如果要在多个函数中传递可变参数,可在传递时添加“…”。

我们对动手写7.4.1的例子稍加改动来进行可变参数传递:

[ 动手写 7.4.2 ]

package main

import "fmt"

func addall(slice ...int) {

   sum := 0
   for _, value := range slice {

      sum = sum + value
   }

   fmt.Println(sum)
}

func add(num ...int) {
   addall(num...)
}

func main() {

   add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
}

运行结果

在这里插入图片描述

如果想传递可变参数本身,可将addall函数的可变参数改为切片:

[ 动手写 7.4.3]

package main

import "fmt"

func addall(slice []int) {

   sum := 0
   for _, value := range slice {

      sum = sum + value
   }

   fmt.Println(sum)
}

func add(num ...int) {
   addall(num)
}

func main() {

   add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
}

运行结果

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ding Jiaxiong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值