Nếu tôi thực hiện một hàng đợi như thế này ...Không đi thu gom rác các phần của lát?
package main
import(
"fmt"
)
func PopFront(q *[]string) string {
r := (*q)[0]
*q = (*q)[1:len(*q)]
return r
}
func PushBack(q *[]string, a string) {
*q = append(*q, a)
}
func main() {
q := make([]string, 0)
PushBack(&q, "A")
fmt.Println(q)
PushBack(&q, "B")
fmt.Println(q)
PushBack(&q, "C")
fmt.Println(q)
PopFront(&q)
fmt.Println(q)
PopFront(&q)
fmt.Println(q)
}
... Tôi kết thúc với một mảng ["A", "B", "C"]
mà không có lát trỏ đến hai yếu tố đầu tiên. Vì con trỏ "bắt đầu" của một slice không bao giờ có thể bị giảm đi (AFAIK), những phần tử này không bao giờ có thể được truy cập.
Bộ thu gom rác của Go có đủ thông minh để giải phóng chúng không?
Để hoàn icza câu trả lời, và đối với trường hợp xếp hàng cụ thể của bạn: phần không thể truy cập của slice sẽ không bị thu gom rác, tuy nhiên, khi bạn 'PushBack' một mục mới và' q' đã đầy, bản sao mới của 'q' sẽ được cấp phát, và trong trường hợp này, ** chỉ các phần tử có thể truy cập ** sẽ được sao chép, vì vậy A, B và C sẽ không được sao chép. 'q' sẽ không phát triển mãi mãi với các yếu tố không thể truy cập được. – siritinga
@siritinga Đó là sự thật, gợi ý tốt. Cảm ơn. Kết hợp nó vào câu trả lời với các thông tin quan trọng bổ sung (như zeroing "slot" nếu một phần tử bị loại bỏ). – icza