最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《go 原子/线程保存中的append() 是吗?》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~
问题内容阅读几个列表后,我想将每个列表中的所有行添加到一个大数组中。我在它自己的 goroutine 中运行每个列表读取器。我可以在读取后立即追加一行吗?
这个帖子能保存吗,还是会在我手里爆炸?
type listHolder {
entries []entry
}
func (h *listHolder) readAllLists(s []list) {
c := make(chan list)
var wg sync.WaitGroup
for _, l := range s {
wg.Add(1)
go h.readSomeList(&wg, l)
}
c.close()
wg.Wait()
}
func (h *listHolder) readSomeList(wg *sync.WaitGroup, l list) {
defer wg.Done()
for e := range extractEntry(l) {
h.entries = append(h.entries, newEntry(e))
}
}
解决方案
像这样就可以了。或者您可能想想出一种不同的架构,例如使用通道将更新提供给单个 go 例程
type listHolder {
entries []entry
m sync.Mutex
}
func (h *listHolder) readAllLists(s []list) {
c := make(chan list)
var wg sync.WaitGroup
for _, l := range s {
wg.Add(1)
go h.readSomeList(&wg, l)
}
c.close()
wg.Wait()
}
func (h *listHolder) readSomeList(wg *sync.WaitGroup, l list) {
defer wg.Done()
for e := range extractEntry(l) {
h.m.Lock()
h.entries = append(h.entries, newEntry(e))
h.m.Unlock()
}
}
今天关于《go 原子/线程保存中的append() 是吗?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注编程网公众号!