Прочитав пару списков, я хочу сложить все строки из каждого списка в один большой массив. Я запускаю каждого средства чтения списков в его собственной горутине. Могу я просто добавить строку, как только она будет прочитана?
Эта ветка спасает или это может взорваться у меня в руке?
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))
}
}
Кроме того, если вы выполните поиск по любым другим вопросам Is X atomic in Go?, все они будут содержать ссылки на соответствующую документацию. Я не думаю, что нам нужен вопрос о Is X atomic in Go? для каждого возможного X, когда ответ один и тот же.

Что-то вроде этого было бы нормально. Или вы можете придумать другую архитектуру, например, использовать канал для подачи обновлений в одноразовую процедуру.
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 не являются безопасными для одновременного чтения и записи. Никакие функции и методы не задокументированы как таковые.