使用切片在Go中实现简单队列

I'm trying to implement a very simple queue in Go using slices. This is the code that I have to enqueue five values and then discard the first two values:

package main

import (
    "fmt"
)

var (
    localQ  []int
)

func main() {
    fmt.Printf("%v %v
", localQ, len(localQ))
    for i := 0; i< 5; i++ {
        localQ = enqueue(localQ, i)

        fmt.Printf("%v %v
", localQ, len(localQ))
    }

    localQ = dequeue(localQ, 2)

    fmt.Printf("%v %v
", localQ, len(localQ))
}

func enqueue(q []int, n int) ([]int) {
    q = append(q, n)

    return q
}

func dequeue(q []int, s int) ([]int) {

    r := q[s:]

    q = nil

    return r
}

Two questions regarding the dequeue func:

1- I'm trying to ensure that the popped items are discarded and garbage collected. Does this function result them to be garbage collected?

2- What are the time and space complexities of r := q[s:]? I know there is an array under each slice. Are the array values being copied? Or is it just a pointer being copied?

Does this function result them to be garbage collected?

If the application enqueues a sufficient number of elements to cause the slice backing array to be reallocated, then the previous backing array (and its elements) will be eligible for collection.

What are the time and space complexities of r := q[s:]?

This is an O(1) operation. The operation does not allocate memory on the heap.