package main import "fmt" type Queue struct { items []int } func (q *Queue) Enqueue(val int) { q.items = append(q.items, val) } func (q *Queue) Dequeue() int { if len(q.items) == 0 { return -1 } val := q.items[0] q.items = q.items[1:] return val } func (q *Queue) Print() { for _, v := range q.items { fmt.Printf("%d -> ", v) } fmt.Println("null") } func main() { q := Queue{} q.Enqueue(10) q.Enqueue(20) q.Dequeue() q.Enqueue(30) q.Print() }
The queue starts empty. Enqueue 10 and 20 adds them in order: 10, then 20. Dequeue removes 10 (the first added). Then enqueue 30 adds it to the end. The queue now has 20 followed by 30.
FIFO means First In, First Out. The first element added to the queue is the first one to be removed, just like people standing in line.
func (q *Queue) Dequeue() int { val := q.items[0] q.items = q.items[1:] return val }
If the queue is empty, accessing q.items[0] causes a runtime panic: index out of range because there is no element at index 0.
package main import "fmt" type Queue struct { items []int } func (q *Queue) Enqueue(val int) { q.items = append(q.items, val) } func (q *Queue) Dequeue() int { if len(q.items) == 0 { return -1 } val := q.items[0] q.items = q.items[1:] return val } func (q *Queue) Print() { for _, v := range q.items { fmt.Printf("%d -> ", v) } fmt.Println("null") } func main() { q := Queue{} q.Enqueue(5) q.Enqueue(10) q.Enqueue(15) q.Dequeue() q.Dequeue() q.Enqueue(20) q.Print() }
Enqueue 5,10,15 adds them in order. Dequeue removes 5 then 10. Remaining is 15. Enqueue 20 adds it after 15. Final queue: 15, 20.
Without synchronization, concurrent access can cause race conditions leading to corrupted data or lost elements because operations interfere with each other.
