...的用法在Go里特别常见,特别是有管切片,数组和变长参数的函数定义和调用时;
‘…’是go语言里的一种语法糖,可以用简单的写法,实现一个多行代码的逻辑;
它的第一个用法主要是用于函数有多个不定参数的情况,可以接受多个不确定数量的参数。可以看看下面这段代码样例:
func join(args ...string) string { //可以接受任意个string参数
return strings.Join(args, " ")
}
func main() {
var strss = []string{
"This",
"is",
"a",
"sample",
"in",
"Golang",
}
join(strss...) //切片被打散传入
}
===== OUTPUT =====
This is a sample in Golang
这段代码就是使用在可变长的参数里, 通过(args ...string) 这样的方式定义了一个args的参数,该参数是一个string类型的可变长参数。 在函数体实现里,可以作为一个数组或者切片进行使用; 如这里例子里的, strings.join(args, ' ')就是作为string的数组进行调用。
第二个用法是slice可以被打散进行传递。
下面直接上例子:
func testRead() {
for {
//从file读取到buf中
//打开文件使用os.Open函数,会返回一个文件句柄和一个error
file, err := os.Open(`test.txt`)
if err != nil {
fmt.Println("文件打开失败:", err)
//读取文件内容可以调用file.Read()方法,接收一个字节数组,
//返回一个int和error
buf := make([]byte, 12)
//此时文件的内容都会读到buf里面,n则是写入了多少个字节,
//n不会超过字节数组buf的长度
n, err := file.Read(buf)
if err != nil && err != io.EOF {
fmt.Println("read buf fail", err)
return
}
//说明读取结束
if n == 0 {
break
}
//读取到最终的缓冲区中
var chunk []byte
chunk = append(chunk, buf[:n]...)
}
}
}
这里append就是对切片的操作,把一个切片或者数组,打散成一个一个的元素。
append是一个可变长度的函数, 调用这个函数,需要一个一个的把元素依次传递为参数,在确定的长度情况下,还可以直接调用,对于数组而言,如果不确定长度,就可以使用...的操作,把数组或者切片打散, 如同例子中的append(chunk, buf[:n]...); 就是buf[0:n]的数组通过...打散成一个个元素,作为append的参数进行调用。