{"record":{"id":"e2426d517af93da7","repo":"TheAlgorithms/Go","slug":"erremptydequeue","errorCode":"ErrEmptyDequeue","errorMessage":"DoublyEnded queue is empty, so can't perform this operation","messagePattern":"DoublyEnded queue is empty, so can't perform this operation","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"structure/deque/deque.go","lineNumber":15,"sourceCode":"// description: Double Ended Queue is a generalized version of Queue data structure that allows insert and delete at both ends.\n// References:\n//\tWikipedia : https://en.wikipedia.org/wiki/Double-ended_queue\n//\tGithub: https://www.geeksforgeeks.org/deque-set-1-introduction-applications/\n// author [Sayan](https://github.com/bose-sayan)\n\n// Package deque implements a Double Ended Queue data structure.\npackage deque\n\nimport (\n\t\"errors\"\n)\n\n// ErrEmptyDequeue is a custom error for handling cases when some dequeuing operation is performed on an empty deque.\nvar ErrEmptyDequeue = errors.New(\"DoublyEnded queue is empty, so can't perform this operation\")\n\ntype DoublyEndedQueue[T any] struct {\n\tdeque []T\n}\n\n// New returns a new DoublyEndedQueue.\nfunc New[T any]() *DoublyEndedQueue[T] {\n\treturn &DoublyEndedQueue[T]{deque: make([]T, 0)}\n}\n\n// EnqueueFront adds an item at the front of Deque.\nfunc (dq *DoublyEndedQueue[T]) EnqueueFront(item T) {\n\tdq.deque = append([]T{item}, dq.deque...)\n}\n\n// EnqueueRear adds an item at the rear of Deque.\nfunc (dq *DoublyEndedQueue[T]) EnqueueRear(item T) {\n\tdq.deque = append(dq.deque, item)","sourceCodeStart":1,"sourceCodeEnd":33,"githubUrl":"https://github.com/TheAlgorithms/Go/blob/5ba447ec5ff3d1213de65b92e726ee74c5d5cc19/structure/deque/deque.go#L1-L33","documentation":"ErrEmptyDequeue is the package-level sentinel error returned by every read/remove operation (DequeueFront, DequeueRear, Front, Rear) on a DoublyEndedQueue that holds no elements. It prevents index panics when accessing dq.deque[0] or the last element of an empty slice.","triggerScenarios":"Calling Front, Rear, DequeueFront, or DequeueRear when len(dq.deque) == 0 — e.g. on a queue created with New() but never populated, or after draining all elements.","commonSituations":"Consumer loops draining a deque until empty; popping both ends of a work-stealing deque without a size check; test code that forgot to seed the deque.","solutions":["Compare the returned error against ErrEmptyDequeue (errors.Is) and treat it as an empty signal","Check the deque length or add an IsEmpty helper before popping","Restructure to a blocking approach (channel) if consumers must wait for items"],"exampleFix":"// before\nv, _ := dq.DequeueFront()\nuse(v) // zero value when empty\n// after\nv, err := dq.DequeueFront()\nif errors.Is(err, deque.ErrEmptyDequeue) {\n    return // deque is empty\n}\nuse(v)","handlingStrategy":"type-guard","validationCode":"if len(dq.Deque()) == 0 {\n    return deque.ErrEmptyDequeue\n}","typeGuard":"func isErrEmptyDequeue(err error) bool { return errors.Is(err, deque.ErrEmptyDequeue) }","tryCatchPattern":"v, err := dq.DequeueRear()\nif errors.Is(err, deque.ErrEmptyDequeue) {\n    return // deque drained\n}\nif err != nil {\n    return err\n}","preventionTips":["Use errors.Is against the exported sentinel rather than string comparison","Track deque size yourself if you pop in a loop","Add an IsEmpty() wrapper in your codebase for all deques"],"tags":["go","data-structures","deque","sentinel-error","underflow"],"backgroundTag":"queue-empty","analyzedSha":"5ba447ec5ff3d1213de65b92e726ee74c5d5cc19","analyzedAt":"2026-09-02T21:54:30.227Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-10T02:17:09.455Z"}