目录
题目描述
请用代码实现一个函数:该函数接收一个整型类型的切片作为参数,函数体使用两个goroutines交替打印切片中的元素。该函数还需要一个参数实现超时控制,在指定的时间后,若切片还没有打印完,要求停止两个goroutines和该函数的执行。
解决方案
对于超时问题,我们可以使用context包中的WithTimeout函数来约束:
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
for {
switch {
case <- ctx.Done():
// timeout...
default:
// ...
}
}
对于交替打印,为了避免两个goroutine打印同一个值,可以让一个goroutine打印切片索引为奇数的值,另一个goroutine打印切片索引为偶数的值。仅仅区分开两个goroutine打印的值还不够,因为不同的goroutine打印的速度不一定相同,因此不能严格的实现“交替打印”。因此需要用一个channel来控制goroutines,让一个goroutine打印完后等待另一个goroutine打印,然后再执行下一轮打印步骤。
实现
题目的目的是实现一个函数,其有两个参数,一个是要打印的切片,另一个是超时时间。为了测试覆盖到更多的场景(比如大长度切片),我们总不能手写一个固定长度的切片去验证我们后续的逻辑,因此,需要写一个生成指定长度的切片的函数:
func GenerateList(min, max int) []int {
result := make([]int, 0)
for i := min; i < max; i++ {
result = append(result, i)
}
return result
}
函数GenerateList生成一个数值连续的切片,它有两个参数,它表示生成的切片的数值范围。min表示切片的最小值,max表示切片的最大值 - 1。
下一步,根据题目的需要,我们需要定义一个函数,用来交替打印切片并实现超时控制,因此该函数要接收两个参数,一个待打印的切片,一个超时时间:
func PrintArray(list []int, timeout float64) {}