Go

go语言中函数使用不定参数问题

在go语言中,函数也可以使用不定参数,可变参数函数即其参数数量是可变的 —— 0 个或多个。声明可变参数函数的方式是在其参数类型前带上省略符(三个点)前缀。

在go语言中,函数也可以使用不定参数,可变参数函数即其参数数量是可变的 —— 0 个或多个。声明可变参数函数的方式是在其参数类型前带上省略符(三个点)前缀。

go
package main

import (
	"fmt"
	"strings"
)

func main() {
	showName("yang","yanxing")
	showName("fan")
	showName("fan","jie","ying")
}

func showName(a ...string)  {
	name := strings.Join(a," ")
	fmt.Println(name)
}

输出:

yang yanxing fan fan jie ying

使用起来还是比较简单的,但是这里需要注意一些问题

  1. 不定参数只能是最后一个参数 如果在不定参数后面还要定义参数的话就会报错,can noly use '...' as final argument in list

  2. 函数的不定参数在内部是一个定义类型的切片 如上面的数,打印a的类型,这是一个[]string

  3. 切片的展开 在使用不定参数的时候,可以传入该类型切片的展开形式,但是如果传入的是展开形式,则其前后就不能再添加参数了

    go
     package main
    
     import (
         "fmt"
         "strings"
     )
    
     func main() {
         name := []string{"yang","yan","xing"}
         showName(name...)
    
     }
    
     func showName(a ...string)  {
         fmt.Println(strings.Join(a," "))
     }

    如果尝试使用shwName(name...,"is","a","good man") 或者showName("my name","is",name...) 则报错

  4. 如果传入的是切片形式的,如果函数内改变切片的值,则会对影响到原切片

    go
     package main
    
     import (
         "fmt"
         "strings"
     )
    
     func main() {
         name := []string{"yang","yan","xing"}
         fmt.Println(name)
         showName(name...)
         fmt.Println(name)
    
     }
    
     func showName(a ...string)  {
         a[0] = "fan"
         a = append(a,"is","a","good","man")
         fmt.Println(strings.Join(a," "))
     }

    输出

    [yang yan xing] fan yan xing is a good man [fan yan xing]

参数文章 Go 语言“可变参数函数”终极指南

杨彦星 后端工程师 · 序语程言主理人

做了八年后端,最近在 AI 行业折腾。喜欢把复杂的事情拆开讲清楚,讨厌「显而易见」这四个字。这里记录我踩过的坑和攒下的经验,愿你少踩一点。

yangyanxing1005@qq.com

查看主页