Что такое starvation (голодание) в контексте конкурентности в Go?
Anonymous Quiz
0%
Горутина завершается из-за ошибки
87%
Горутина ожидает доступ к ресурсу, но не может получить, т. к. др. горутины постоянно его используют
3%
Горутина занимает слишком много памяти
5%
Горутина выполняется слишком долго без перерыва.
5%
Посмотреть результаты
Что выведет код?
Anonymous Quiz
52%
true
27%
false
2%
Ничего не выведет
8%
Ошибку компиляции
12%
Посмотреть результаты
Forwarded from Библиотека Go-разработчика | Golang
В Go новички часто сталкиваются с проблемой интерфейсных переменных, которым присваивае
тся
nil указатель. В таком случае, хотя значение в интерфейсе является
nil, сама переменная интерфейса не равна
nil.Пример: создаем перемен
н
ую x как указатель на
int, который по умолчанию
nil, и переменн
ую y как пустой интерфейс, который тоже
nil по умолчанию. После присваиван
ия x переменн
ой y, интерфе
йс y уже не является
nil, хо
тя x все еще
nil.
var x *int
var y any
y = x
📌 Что верне
т y == n
il? Верне
т fal
se. Это потому, что интерфейс не просто представляет значение, которое ему присвоено, а действует как контейнер для этого значения.Для проверки, является ли значение в интерфейс
е n
il, нужно использовать утверждение типа. Например, для проверки
y на n
il, используем:
y.(*int) == nil
Это показывает, что интерфейс
y
не nil
, но содержащееся в нем значение — nil
. Полный пример здесь.#tip
Please open Telegram to view this post
VIEW IN TELEGRAM
go.dev
Go Playground - The Go Programming Language
Есть буферизованный канал с определенной емкостью и горутина, которая читает из него данные. Что произойдет, если канал закроется, хотя в нем еще остались данные?
Anonymous Quiz
6%
Паника во время выполнения
15%
Данные в канале будут потеряны
54%
Горутина сможет продолжить чтение данных до тех пор, пока канал не станет пустым
14%
Никаких изменений не произойдет до тех пор, пока не будут считаны все данные
6%
deadlock
5%
Посмотреть результаты
Что выведет код?
Anonymous Quiz
14%
0
28%
1
37%
NaN
7%
Ошибку компиляции
5%
Панику во время выполнения
8%
Посмотреть результаты
Что выведет код?
Anonymous Quiz
2%
0
30%
1
54%
2
3%
Панику во время выполнения
4%
Ошибку компиляции
6%
Посмотреть результаты
Что выведет код?
Anonymous Quiz
64%
2
22%
Ошибку компиляции
4%
Панику во время выполнения
7%
Ошибку компиляции
2%
Посмотреть результаты
Forwarded from Библиотека Go-разработчика | Golang
💡Стек или куча?
🤔 Живет ли переменная на стеке вызовов, или она динамически выделена в куче?
В большинстве случаев вам не стоит беспокоиться об этом. Go собирает мусор и автоматически очищает неиспользуемые переменные.
Однако сборка мусора имеет свою цену, поэтому чем меньше выделений делает ваш код, тем быстрее он может работать.
📌 Как узнать, выделяется ли переменная в куче?
Некоторые операции по умолчанию вызывают выделение памяти в куче и поэтому легко обнаруживаются и исправляются. Вот несколько примеров:
🔸Строковые переменные неизменяемы. Конкатенация двух строк приводит к новой аллокации и сборке мусора. В качестве альтернативы можно использовать
🔸Срезы, которые растут за пределы своей емкости, реаллоцируются. Решение: предварительно выделить срез с помощью
🔸Когда функция создает локальную переменную и возвращает указатель на эту переменную, переменная должна быть выделена в куче.
📌 Однако есть ситуации, когда выделения в куче неочевидны. Подумайте об указателях, скрытых внутри других типов данных, таких как срезы или мапы. Или рассмотрите массивы. Если массив слишком большой, чтобы жить на стеке, он выделяется в куче.
📌 Как найти эти случаи выделения в куче?
Запустите или скомпилируйте свой код с флагом сборки мусора "
#tip
🤔 Живет ли переменная на стеке вызовов, или она динамически выделена в куче?
В большинстве случаев вам не стоит беспокоиться об этом. Go собирает мусор и автоматически очищает неиспользуемые переменные.
Однако сборка мусора имеет свою цену, поэтому чем меньше выделений делает ваш код, тем быстрее он может работать.
📌 Как узнать, выделяется ли переменная в куче?
Некоторые операции по умолчанию вызывают выделение памяти в куче и поэтому легко обнаруживаются и исправляются. Вот несколько примеров:
🔸Строковые переменные неизменяемы. Конкатенация двух строк приводит к новой аллокации и сборке мусора. В качестве альтернативы можно использовать
strings.Builde
r.🔸Срезы, которые растут за пределы своей емкости, реаллоцируются. Решение: предварительно выделить срез с помощью
make(
)
.🔸Когда функция создает локальную переменную и возвращает указатель на эту переменную, переменная должна быть выделена в куче.
📌 Однако есть ситуации, когда выделения в куче неочевидны. Подумайте об указателях, скрытых внутри других типов данных, таких как срезы или мапы. Или рассмотрите массивы. Если массив слишком большой, чтобы жить на стеке, он выделяется в куче.
📌 Как найти эти случаи выделения в куче?
Запустите или скомпилируйте свой код с флагом сборки мусора "
-
m", и команда Go выведет заметку каждый раз, когда переменная перемещается или уходит со стека в кучу:go run -gcflags "-m"
или
go tools compile -m
#tip
Что выведет код?
Anonymous Quiz
40%
true
35%
false
9%
Панику во время выполнения
9%
Ошибку компиляции
7%
Посмотреть результаты
Что выведет код?
Anonymous Quiz
45%
true
47%
false
2%
Панику во время выполнения
3%
Ошибку компиляции
4%
Посмотреть результаты
Что выведет код?
Anonymous Quiz
49%
0
45%
1
2%
Панику во время выполнения
2%
Ошибку компиляции
2%
Посмотреть результаты