背景

众所周知,Go语言是严格类型语言,而开发的时候又遇到传入参数不定的情况,怎么办?

函数可变数量参数

示例

  1. func main() {
  2. multiParam("sam", "crystal")
  3. names := []string{"sam", "crystal"}
  4. multiParam(names...)
  5. }
  6. func multiParam(args ...string) {
  7. //接受的参数放在args数组中
  8. for _, e := range args {
  9. fmt.Println(e)
  10. }
  11. }

需要注意的是,可变参数是函数最右边的参数,普通参数放在左侧,可以0到n个。如

  1. func main() {
  2. multiParam("sam", 1)
  3. multiParam("crystal", 1, 2)
  4. }
  5. func multiParam(name string, args ...int) {
  6. fmt.Println(name)
  7. for _, e := range args {
  8. fmt.Println(e)
  9. }
  10. }

可变函数的参数

s如果使用s...符号解压缩切片,则可以将切片直接传递给可变参数函数。在这种情况下,不会创建新的切片。

  1. func main() {
  2. names := []string{"sam", "crystal"}
  3. //它和multiParam("sam", "crystal") 写法是效果一样,只是可变参数传值方法不会创建新的切片,直接使用传递的切片。
  4. multiParam(names...)
  5. }
  6. func multiParam(args ...string) {
  7. //接受的参数放在args数组中
  8. for _, e := range args {
  9. fmt.Println(e)
  10. }
  11. }

还有一种情况就是通过append合并两个slice

  1. func main() {
  2. stooges := []string{"Moe", "Larry", "Curly"}
  3. lang := []string{"php", "golang", "java"}
  4. stooges = append(stooges, lang...)
  5. fmt.Println(stooges) //[Moe Larry Curly php golang java]
  6. }

数组文字

在数组文字中,…符号指定的长度等于文字中元素的数量。

  1. func main() {
  2. stooges := []string{"Moe", "Larry", "Curly"}
  3. arr := [...]int{1, 2, 3}
  4. fmt.Println(len(stooges)) //3
  5. fmt.Println(len(arr)) //3
  6. }

go命令

go描述软件包列表时,命令使用三个点作为通配符。

此命令测试当前目录及其子目录中的所有软件包。

  1. $ go test ./...

参考资料

https://github.com/guyan0319/golang_development_notes/blob/master/zh/9.14.md