当试图模拟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...)