我是靠谱客的博主 细心帅哥,最近开发中收集的这篇文章主要介绍函数调用中的参数太多_Go 变长参数,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

变长参数和变长参数函数类型

一个函数的最后一个参数可以是一个变长参数。一个函数可以最多有一个变长参数。一个变长参数的类型总为一个切片类型。 变长参数在声明的时候必须在它的(切片)类型的元素类型前面前置三个点 ...,以示这是一个变长参数。 两个变长函数类型的例子:
func (values ...int64) (sum int64)
func (sep string, tokens ...string) string

变长函数声明

变长函数声明和普通函数声明类似,只不过最后一个参数必须为变长参数。 一个变长参数在函数体内将被视为一个切片。

// Sum返回所有输入实参的和。
func Sum(values ...int64) (sum int64) {
// values的类型为[]int64。
sum = 0
for _, v := range values {
sum += v
}
return
}
// Concat是一个低效的字符串拼接函数。
func Concat(sep string, tokens ...string) string {
// tokens的类型为[]string。
r := ""
for i, t := range tokens {
if i != 0 {
r += sep
}
r += t
}
return r
}

从上面的两个变长参数函数声明可以看出,如果一个变长参数的类型部分为...T,则此变长参数的类型实际为[]T

事实上,fmt标准库包中的PrintPrintlnPrintf函数均为变长参数函数。 它们的声明大致如下:

func Print(a ...interface{}) (n int, err error)
func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)

变长参数函数调用

在变长参数函数调用中,可以使用两种风格的方式将实参传递给类型为[]T的变长形参:

  1. 传递一个切片做为实参。此切片必须可以被赋值给类型为[]T的值(或者说此切片可以被隐式转换为类型[]T)。 此实参切片后必须跟随三个点...
  2. 传递零个或者多个可以被隐式转换为T的实参(或者说这些实参可以赋值给类型为T的值)。 这些实参将被添加入一个匿名的在运行时刻创建的类型为[]T的切片中,然后此切片将被传递给此函数调用。

注意,这两种风格的方式不可在同一个变长参数函数调用中混用。

下面这个例子展示了一些变长参数函数调用:

package main
import "fmt"
func Sum(values ...int64) (sum int64) {
sum = 0
for _, v := range values {
sum += v
}
return
}
func main() {
a0 := Sum()
a1 := Sum(2)
a3 := Sum(2, 3, 5)
// 上面三行和下面三行是等价的。
b0 := Sum([]int64{}...) // <=> Sum(nil...)
b1 := Sum([]int64{2}...)
b3 := Sum([]int64{2, 3, 5}...)
fmt.Println(a0, a1, a3) // 0 2 10
fmt.Println(b0, b1, b3) // 0 2 10
}
package main
import "fmt"
func Concat(sep string, tokens ...string) (r string) {
for i, t := range tokens {
if i != 0 {
r += sep
}
r += t
}
return
}
func main() {
tokens := []string{"我的", "恋人是", "画图"}
langsA := Concat("(ง •_•)ง", tokens...) // 风格1
langsB := Concat("(ง •_•)ง", "我的", "恋人是", "画图") // 风格2
fmt.Println(langsA)
// 我的(ง •_•)ง恋人是(ง •_•)ง画图
fmt.Println(langsA == langsB)
// true
}

最后

以上就是细心帅哥为你收集整理的函数调用中的参数太多_Go 变长参数的全部内容,希望文章能够帮你解决函数调用中的参数太多_Go 变长参数所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部