package channel import ( "errors" "sync" ) type TaskChannel struct { name string c chan interface{} closed bool mutex sync.Mutex } func NewTaskChannel(name string) *TaskChannel { return &TaskChannel{ c: make(chan interface{}, 100), name: name, } } // IsClosed 判断channel是否关闭 func (c *TaskChannel) IsClosed() bool { c.mutex.Lock() defer c.mutex.Unlock() return c.closed } // SendData 发送数据 func (c *TaskChannel) SendData(data interface{}) error { c.mutex.Lock() defer c.mutex.Unlock() if c.closed { return errors.New("管道已关闭") } c.c <- data return nil } func (c *TaskChannel) Close() { c.mutex.Lock() defer c.mutex.Unlock() if c.closed { return } close(c.c) c.closed = true } func (c *TaskChannel) Read() (data interface{}, ok bool, err error) { c.mutex.Lock() if c.closed { err = errors.New("管道已关闭") return } c.mutex.Unlock() data, ok = <- c.c return } func (c *TaskChannel) ResetChannel() (err error) { c.mutex.Lock() defer c.mutex.Unlock() if !c.closed { err = errors.New("管道未关闭") return } c.closed = false c.c = make(chan interface{}, 50) return }