今天的一个例子中发现,对于在调用可变参数函数时,不是总能使用省略号将一个切片展开,有时候编译器可能会报错,为了清楚的说明这个问题,我用几个小例子一步一步说明。
1、提出假想的需求
假如想要在一堆数据中找出最小的一个,该怎么做?
func MinimumInt(others ...int) int {
}
则此函数接收一个可变参数,甚至长度可为0(即不传入参数),显然,不传入参数时调用该函数不满足提出的需求。
上面的例子中,我们仅仅做了对int型数据的处理,如果数据是其他类型呢?能否实现一个通用的处理函数,可以处理几乎所有类型的数据?
对于这个问题,在C++中很容易通过泛型来解决,Go中虽不支持这么做,但也还是有解决方法–空接口
Minimum(sliceInt[0], sliceInt[1:])
编译就通过了,但是这样调用后并不能得到数据中的最小值,原因稍后解释!
然后,本着好奇,我尝试着将MinimumInt函数的调用方式改成了如下:
MinimumInt(sliceInt[0], sliceInt[1:]) //不再使用省略号展开
再次编译,我得到了如下的错误提示:
对于interface{}空接口,它可以代指任何类型的数据,比如:
可能有人会认为,interface{}可用于指代int型数据,那么是不是[]interface{}就是指代[]int型数据的呢?那么做一个测试:
var inter_d []interface{} = sliceInt[:]
而在编译时,编译器报告错误:
Minimum(sliceInt[0], sliceInt[1], sliceInt[2], sliceInt[3])
这样调用也就没有错误了!因为我们用正确的方式构造了一个切片!