go 语言是google 开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。2009年11月正式宣布推出,在2016年,Go被软件评价公司TIOBE 选为TIOBE 2016 年最佳语言

go语言简洁的语法和内存安全以及并发计算深受互联网公司的青睐。下面就介绍其中的一个简洁的语法糖 ...

... 作为go语言的语法糖,主要有下面两种用法

  • 作为函数的可变参数,表示可以接受任意个数但是相同类型的参数

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    package main
    
    import (
        "fmt"
        "reflect"
    )
    
    func print(who ...string) {
        fmt.Println("type is :", reflect.TypeOf(who))
    
        for _, v := range who {
            fmt.Printf("%v\t", v)
        }
        fmt.Println("")
    }
    
    func main() {
        users := []string{"zhangsan", "lisi", "wangwu", "zhaoliu"}
    
        print("A", "B", "C") //1
        print(users...) //2
        print() //3
    }
    

    运行上面代码打印如下:

    1
    2
    3
    4
    5
    
    type is : []string
    zhangsan        lisi    wangwu  zhaoliu
    type is : []string
    A       B       C
    type is : []string
    

    由上面一段代码可以看出,print函数的参数定义为...string 类型 第一次调用的时候传入的是三个字符常量,打印出的who 类型为[]string。

    也就是…T 类型等价于[]T 类型

    在官方文档上有这么一段描述

    1
    
    If f is variadic with a final parameter p of type ...T, then within f the type of p is equivalent to type []T. If f is invoked with no actual arguments for p, the value passed to p is nil. Otherwise, the value passed is a new slice of type []T with a new underlying array whose successive elements are the actual arguments, which all must be assignable to T. The length and capacity of the slice is therefore the number of arguments bound to p and may differ for each call site. 
    

    当print 不传递参数时,who的值为nil,类型还是[]string, 如第3处调用

    如上代码第2处print调用就是将切片打散,然后作为不定参数传入…sting,也就是下面的第二个用处

  • 将切片打散

    我们常用的append函数定义就是采用了 ...

    append(s S, x ...T) S // T is the element type of S

    1
    2
    3
    
    src := []int{1, 2, 3}
    dst := []int{0}
    dst = append(dst, src...)
    

    如上代码,将切片src的元素打散传入dst 中。