Хранит ли Go объекты на карте по значению или как указатели? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть следующая карта:

var conns map[string]Conn

Где, как вы знаете, Conn - это пользовательский тип. И моя карта хранит значения типов Conn, как показывает объявление. Для хранения их на карте я делаю это:

conns["127.0.0.1"] = Conn{}

Но мой вопрос: хранит ли Go под указателем объект Conn или он действительно хранит значение?

1 Ответ

4 голосов
/ 09 июля 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...