👾 — Только default
👍 — prepare, затем sent
🥰 — Ошибка компиляции
⚡️ — prepare, затем default
Ответ: ⚡️ — prepare, затем default.
При входе в select выражения каналов и отправляемых значений вычисляются до выбора ветки. Поэтому prepare() вызывается. Канал небуферизированный, а получателя нет: отправка не готова, и выбирается default. Горутин, которые могли бы изменить этот результат, в программе нет.
👾 — 1
👍 — Ошибка компиляции
🥰 — 2
⚡️ — Паника во время выполнения
Ответ: 👍 — Ошибка компиляции.
Значение структуры, полученное через индексирование map, не предоставляет адресуемое поле для такого изменения. Можно получить копию: user := users["ann"], изменить user.Score и записать структуру обратно: users["ann"] = user. При этом users["ann"]++ для map[string]int — другая операция, она допустима.
В user попадает копия очередной структуры. Меняется поле этой копии, а элементы среза остаются прежними. Чтобы изменить исходные значения, можно перебирать индексы и выполнять users[i].Score += 10. Правило новых переменных цикла в Go 1.22 не превращает копию структуры в ссылку.
У free длина 2 и ёмкость 4: append использует исходный массив и записывает 9 в a[2]. У limited длина и ёмкость равны 2. Для добавления элемента нужен новый массив, поэтому y[2] равен 8, а a[2] остаётся 9. Само выражение a[:2:2] копию массива не создаёт.
👾 — arg 1, затем closure 2
👍 — closure 1, затем arg 1
🥰 — arg 2, затем closure 2
⚡️ — closure 2, затем arg 1
Ответ: ⚡️ — closure 2, затем arg 1.
Аргумент n для fmt.Println вычисляется при выполнении первого defer и сохраняется как 1. Замыкание читает переменную позднее и видит 2. Отложенные вызовы выполняются в обратном порядке регистрации: сначала замыкание, затем fmt.Println с сохранённым аргументом.