package main import ( "sync" ) type GTask struct { GQueue sync.WaitGroup *GManager } func (my *GTask) Init(manager *GManager, qsize int) *GTask { my.GManager = manager my.GQueue.Init(qsize) return my } func (my *GTask) Enter() { if my.GManager != nil { my.GManager.Enter() } my.WaitGroup.Add(1) } func (my *GTask) Exit() { my.WaitGroup.Done() if my.GManager != nil { my.GManager.Exit() } } func (my *GTask) Join() { my.WaitGroup.Wait() }