Ядро чата MsgStore на RWMutex

Код-ревьюMiddle20 минпроверка — Спринт08-t025

Нужно ядро чата, хранящее все сообщения в памяти: метод отправки (принимает текст, возвращает id) и метод получения (принимает id, возвращает текст). Дан черновой вариант — MsgStore с RWMutex и map[int]entry. Разберите его по шагам, прокомментируйте и исправьте.

Дополнительно: что изменится, если хранить RWMutex по значению, а не по указателю? Допустимо ли это и почему? Где в памяти будет жить RWMutex в каждом случае?

Как на собесе: 20 минут, ищи всё — гонки, утечки, ошибки, безопасность, стиль. Ссылайся на строки.

review.gogo
1const placeholderStr = "placeholder ready"2 3type entry struct {4	Text string5	// others ...6}7 8type MsgStore struct {9	Items  map[int]entry10	LastID int11	Mu     *sync.RWMutex12	Closed bool13}14 15type MsgStoreAPI interface {16	send(ctx context.Context, text string) (int, error)17	receive(id int) (string, error)18	shutdown() bool // ...?19}20 21//22func NewStore() MsgStoreAPI {23	items := make(map[int]entry)24	return &MsgStore{25		Mu:    &sync.RWMutex{}26		Items: items27	}28}29 30func (d *MsgStore) shutdown() bool {31	d.Mu.Lock()32	defer d.Mu.Unlock()33 34	d.Closed = true35 36}37 38func (d *MsgStore) send(text string) (int, error) {39 40	if d.Closed {41		panic("Closed!!!")42	}43 44	d.Mu.Lock()45 46	d.LastID++ //47	d.Items[d.LastID] = entry{48		Text: text49	}50	d.Mu.Unlock()51 52	return d.LastID53}54 55func (d *MsgStore) receive(id int) (string, error) {56	// Если id // 15 -> placeholder string57	if (id % 15) == 0 {58		return placeholderStr, nil59	}60 61	d.Mu.RLock()62	defer d.Mu.RUnlock()63 64	val, ok := d.Items[id]; !ok {65		return "", fmt.Errorf("entry not found, empty. id-%d", id)66	}67 68	retrun val.Text, nil69}70 71func main() {72 73}
⌘ Enter — проверить