package data import ( "time" "github.com/google/uuid" ) type Article struct { Title string Created time.Time Desc string Content string Tags []string UUID uuid.UUID } type ArticleList struct { addCh chan *Article delCh chan uuid.UUID retCh chan *Article listCh chan []Article list []*Article } func (l *ArticleList) start() { for { select { case article := <-l.addCh: l.list = append(l.list, article) case uuid := <-l.delCh: for i, article := range l.list { if article.UUID == uuid { l.list = append(l.list[:i], l.list[i+1:]...) l.retCh <- article } } case l.listCh <- func() []Article { var list []Article for _, article := range l.list { list = append(list, *article) } return list }(): } } } func NewArticleList() *ArticleList { list := &ArticleList{ addCh: make(chan *Article), delCh: make(chan uuid.UUID), retCh: make(chan *Article), listCh: make(chan []Article), list: []*Article{}, } go list.start() return list } func (l *ArticleList) Add(a *Article) { l.addCh <- a } func (l *ArticleList) Release(uuid uuid.UUID) (*Article, bool) { l.delCh <- uuid article := <-l.retCh if article == nil { return nil, false } return article, true } func (l *ArticleList) List() []Article { return <-l.listCh }