struct
с сохраняются по значению.Доступ к conns["127.0.0.1"]
даст вам копию структуры Conn
.
Если вы попытаетесь изменить структуру, подобную этой, структура на conns["127.0.0.1"]
останется неизменной, пока выперезаписать запись карты с помощью недавно измененной структуры:
c := conns["127.0.0.1"]
c.x = y
// `c` now contains different content to `conns["127.0.0.1"]`!
// To ensure conns["127.0.0.1"] is updated, either overwrite or use a point.
conns["127.0.0.1"] = c // overwrite
Вот почему при изменении структуры структура в карте остается неизменной до тех пор, пока вы не перезапишите запись карты с новой структурой.
Вместо этого вы можете хранить указатель на структуру.Это позволяет напрямую изменять структуру.
Так что если вы измените тип conns
с map[string]Conn
на map[string]*Conn
, первые две строки приведенного выше кода обновят структуру в карте.
Более подробную информацию можно найти здесь: https://www.ardanlabs.com/blog/2017/07/interface-semantics.html