package main import ( "fmt" ) export{ "T": type{int, uint, struct{type, type, int}}, "syncable": type{$T, bool, sync.Mutex} } type syncer interface{ sync($T) $syncable } type queue($T) []$T func (q *queue($T)) enqueue(v $T) { *q = append(*q, v) } func (q *queue($syncable)) dequeue() ($syncable, bool) { if len(*q) == 0 { var zero $syncable return zero, false } r := (*q)[0] *q = (*q)[1:] return r, true } func main() { q := new(queue(int)) q.enqueue(5) q.enqueue(6) fmt.Println(q) fmt.Println(q.dequeue()) fmt.Println(q.dequeue()) fmt.Println(q.dequeue()) }