当可变参数直接附加到切片时与在for循环中单独添加时变量类型的差异



当试图模拟go lang中的队列接口时,在Enque方法中,我将可变参数直接附加到切片中。但当在Deque操作中检索到类型断言时,出现了错误。将可变参数直接附加到切片与单独添加它们有何不同?

type Queue struct {
queueItems []Item
}
func (queue *Queue) Enque(items ...Item) error {
...
queue.queueItems = append(queue.queueItems, items)
...
}
....
queue.Enque(200)
val := queue.Deque()
otherVal := val.(int)
.....

Enque的以下代码工作良好

func (queue *Queue) Enque(items ...Item) error {
....
for _, itemVal := range items {
queue.queueItems = append(queue.queueItems, itemVal)
}
....
}

当您为函数定义可变形式参数时,当您在函数中使用实际参数时,实际参数的基本类型是您声明的任何类型的切片。在这种情况下,Enqueue中的形式参数items在函数中使用时解析为[]Item的类型(Item的切片(。

所以当你写queue.queueItems = append(queue.queueItems, items)的时候,你真正想说的是把这整片项目作为一个奇异元素附加到我的片上。

您想要做的是将可变参数中的每个项作为单独的元素附加到切片上,您可以通过以下方式实现:queue.queueItems = append(queue.queueItems, items...)

最新更新