Нужно ядро чата, хранящее все сообщения в памяти: метод отправки (принимает текст, возвращает id) и метод получения (принимает id, возвращает текст). Дан черновой вариант — MsgStore с RWMutex и map[int]entry. Разберите его по шагам, прокомментируйте и исправьте.
Дополнительно: что изменится, если хранить RWMutex по значению, а не по указателю? Допустимо ли это и почему? Где в памяти будет жить RWMutex в каждом случае?
Как на собесе: 20 минут, ищи всё — гонки, утечки, ошибки, безопасность, стиль. Ссылайся на строки.
review.gogo
1constplaceholderStr="placeholder ready"23typeentrystruct{4Textstring5// others ...6}78typeMsgStorestruct{9Itemsmap[int]entry10LastIDint11Mu*sync.RWMutex12Closedbool13}1415typeMsgStoreAPIinterface{16send(ctxcontext.Context,textstring)(int,error)17receive(idint)(string,error)18shutdown()bool// ...?19}2021//22funcNewStore()MsgStoreAPI{23items:=make(map[int]entry)24return&MsgStore{25Mu:&sync.RWMutex{}26Items:items27}28}2930func(d*MsgStore)shutdown()bool{31d.Mu.Lock()32deferd.Mu.Unlock()3334d.Closed=true3536}3738func(d*MsgStore)send(textstring)(int,error){3940ifd.Closed{41panic("Closed!!!")42}4344d.Mu.Lock()4546d.LastID++//47d.Items[d.LastID]=entry{48Text:text49}50d.Mu.Unlock()5152returnd.LastID53}5455func(d*MsgStore)receive(idint)(string,error){56// Если id // 15 -> placeholder string57if(id%15)==0{58returnplaceholderStr,nil59}6061d.Mu.RLock()62deferd.Mu.RUnlock()6364val,ok:=d.Items[id];!ok{65return"",fmt.Errorf("entry not found, empty. id-%d",id)66}6768retrunval.Text,nil69}7071funcmain(){7273}