golang_speak | Unsorted

Telegram-канал golang_speak - Golang tests

5413

@haarrp - по всем вопросам @Golang_google - Golang для разработчиков @itchannels_telegram - 🔥лучшие ит-каналы @golangl - golang chat @golangtests - golang tests @golang_jobsgo - go chat jobs @ai_machinelearning_big_data - AI

Subscribe to a channel

Golang tests

👨🏻‍💻 AI в бэкенд-задачах — на Podlodka Backend Crew

Код теперь может написать агент, но за результат всё ещё отвечаете вы. Организаторы Podlodka Backend Crew собрали конференцию о том, как работать с бэкендом после того, как AI написал код.

Причём в программе нет докладов в жанре «у нас все получилось» — только реальная практика. Конференция пройдёт с 26 по 30 октября.

🧠️️️️ Участники сезона:

• Разберут пулл‑реквесты от агента и попробуют предотвратить возможные инциденты на рулетке кейсов

• Выяснят, какие неожиданные ловушки скрываются в OpenAPI и на что обращать внимание при разработке контрактов

• Разберут антипаттерны в AI-юнит-тестах, узнают, как их избежать с помощью современных инструментов, и заберут себе новый агентский скилл

• Спроектируют бэкенд дейтинг-приложения на архитектурной кате и решат, где в нём действительно нужен AI.

Формат Podlodka Backend Crew
— комфортный онлайн: 5 дней, утренние и вечерние сессии в Zoom.

Отдельный плюс — цена: заметно ниже привычных конференций, при этом вы не просто слушаете о чужом опыте, а разбираете PR и отвечаете за релиз, проектируете систему в команде и расследуете чужие провалы.

Такого вовлечения не получить на обычной конференции.

🔗 Изучайте программу и присоединяйтесь: https://podlodka.io/becrew

Промокод на скидку для подписчиков backendcrew

Читать полностью…

Golang tests

Задача по Go: `select` и побочные эффекты

Что выведет программа?


package main

import "fmt"

func value() int {
fmt.Print("A")
return 42
}

func main() {
var ch chan int

select {
case ch <- value():
fmt.Print("B")
default:
fmt.Print("C")
}
}


Варианты:

1. C
2. AC
3. AB
4. Программа зависнет

Ответ: 2. Вывод будет `AC`.

ch равен nil, поэтому отправка никогда не может выполниться и select выбирает default.

Но перед выбором ветки Go один раз вычисляет каналы и правые части всех операций отправки. Поэтому value() всё равно вызывается и печатает A. Затем выполняется default, который печатает C.

#Golang #GoLang #Programming

Читать полностью…

Golang tests

👣 Задача на Go 1.27: concurrent job scheduler с generic methods

Нужно реализовать библиотеку scheduler, которая запускает задачи параллельно, ограничивает concurrency, поддерживает context.Context, retry, timeout и возвращает типизированные результаты.

💡 Требования

Создайте generic-тип:


type Scheduler[T any] struct {
// ...
}

Он должен поддерживать регистрацию задач:

type Job[T any] func(ctx context.Context) (T, error)

И новый generic method Go 1.27:

func (s *Scheduler[T]) Map[R any](
ctx context.Context,
fn func(context.Context, T) (R, error),
) ([]R, error)
Функциональность

Scheduler должен уметь:

выполнять не более N задач одновременно;
отменять все оставшиеся задачи при отмене context.Context;
задавать timeout для каждой задачи;
делать до K retry с exponential backoff;
сохранять исходный порядок результатов;
не иметь data race;
корректно завершать goroutines без утечек;
возвращать ошибку с информацией, какая задача упала.

Пример API:

```go
s := scheduler.New[int](
scheduler.WithWorkers(8),
scheduler.WithRetries(3),
scheduler.WithTimeout(2*time.Second),
)

for i := range 100 {
n := i

s.Add(func(ctx context.Context) (int, error) {
return expensiveOperation(ctx, n)
})
}

values, err := s.Run(ctx)

strings, err := s.Map(ctx, func(
ctx context.Context,
value int,
) (string, error) {
return strconv.Itoa(value), nil
})


Ограничения

• Нельзя использовать сторонние worker-pool библиотеки.
• Можно использовать только standard library.
• Нельзя запускать goroutine на каждую задачу без ограничения.
• Нельзя игнорировать ctx.Done().

Решение должно проходить:

go test ./...
go test -race ./...
go vet ./...
Дополнительный уровень


Добавьте:


func (s *Scheduler[T]) Stream(
ctx context.Context,
) <-chan Result[T]


где результаты приходят сразу после завершения задач, а не после окончания всего batch.

Ещё сложнее:


priority queue;
dynamic worker count;
graceful shutdown;
metrics через expvar;
retry только для определённых типов ошибок;
panic recovery внутри job;
benchmark;
fuzz tests.


Главный вопрос

Как реализовать Scheduler так, чтобы одновременно обеспечить:

bounded concurrency + cancellation + ordering + retries + no goroutine leaks + no races

Читать полностью…

Golang tests

👣 Go 1.27: почему две разные closure внезапно могут иметь одинаковый адрес функции?

Что выведет этот код и почему на Go 1.27 поведение стало особенно интересным?


package main

import (
"fmt"
"reflect"
)

func makeFn(x int) func() int {
return func() int {
return x
}
}

func main() {
a := makeFn(10)
b := makeFn(20)

pa := reflect.ValueOf(a).Pointer()
pb := reflect.ValueOf(b).Pointer()

fmt.Println(a(), b())
fmt.Println(pa == pb)
}


Интуитивно хочется сказать:

a и b замыкают разные значения, значит это две разные функции и адреса должны отличаться.

Но в Go 1.27 компилятор стал агрессивнее объединять одинаковый машинный код function literals.

У a и b может быть:

один и тот же code pointer
но разное closure data
поэтому a() возвращает 10, а b() - 20

То есть функция в Go на уровне runtime - это не просто адрес машинного кода.

У замыкания фактически есть ещё окружение с захваченными данными.

Именно поэтому сравнивать функции по reflect.Value.Pointer() как способ определить, «одна ли это функция», нельзя.

Go 1.27 специально предупреждает: разные closure с разными захваченными данными теперь могут чаще иметь одинаковые code pointers из-за оптимизаций компилятора.

Читать полностью…

Golang tests

Искали концерты с друзьями как раз, а тут еще и научпоп, вязли билеты

Читать полностью…

Golang tests

Лето, ИТ-Пикник и музыка известных артистов уже через несколько дней!

8 августа в Коломенском пройдет ИТ-Пикник.

В программе — выступления проекта LAB Антона Беляева, IOWA, Cream Soda, Pompeya, мартина и Совы.

А днем — научпоп-лекции, дискуссии об ИИ и больших языковых моделях, мастер-классы и интерактивы. Полезные знакомства и развлечения тоже будут.

Зарегистрироваться и узнать подробности можно на сайте мероприятия.

В билет входит +1 — можно позвать близких и друзей.

До встречи в месте притяжения ИТ.

Читать полностью…

Golang tests

Каждый год в середине лета мы с друзьями собираемся на E-CODE. Ещё относительно молодая конфа Ozon Tech стала уже своего рода легендой. Не удивительно: хардовость официальной части здесь не уступает громкости афтерпати.

На E-CODE 2026 нас по части бэкэнда ждут:

• Runtime Async с его + и –
• трассировка с eBPF
• ускорение на SIMD
• построение кастомной real-time системы видеоаналитики
• сравнительный анализ алгоритмов сборки мусора

Фишка этого года — брейнринг разработчиков и ИИ. Эксперты разберут сложные кейсы и сравнят свои подходы с тем, что предложит машина. Победителя выберет зал.

Регистрируйтесь сейчас, чтобы услышать это всё вживую: https://ecode.ozon.tech/

12 и 13 сентября, Москва. До встречи на E-CODE!

Читать полностью…

Golang tests

Проблема в том, что `result` - это слайс, к которому одновременно пишут несколько горутин без синхронизации. `append` не потокобезопасен: может испортить внутреннюю структуру слайса или потерять изменения. Нужен мьютекс или `sync.Map`, или собирать результаты через канал.

Читать полностью…

Golang tests

В Go 1.26 появился типобезопасный errors.AsType, который ищет ошибку нужного типа внутри дерева обёрток.


package main

import (
"errors"
"fmt"
)

type CodeError struct {
Code int
}

func (e *CodeError) Error() string {
return fmt.Sprintf("code=%d", e.Code)
}

type MaskError struct {
Value int
}

func (e MaskError) Error() string {
return "masked"
}

func (e MaskError) As(target any) bool {
dst, ok := target.(**CodeError)
if !ok {
return false
}

*dst = &CodeError{Code: e.Value}
return true
}

func main() {
err := errors.Join(
fmt.Errorf("left: %w", MaskError{Value: 10}),
errors.Join(
&CodeError{Code: 20},
fmt.Errorf("right: %w", &CodeError{Code: 30}),
),
)

result, ok := errors.AsType[*CodeError](err)
fmt.Println(ok, result.Code)
}


Что будет выведено?

true 10

Кажется, ответ должен быть 20: это первая настоящая ошибка типа *CodeError. Но errors.AsType обходит дерево в глубину, начиная с первой ветки.

MaskError встречается раньше и через собственный метод As притворяется *CodeError, записывая значение с кодом 10. Поэтому дальнейший поиск прекращается.

Cлучай, когда тип ошибки определяется не только её реальным типом, но и поведением метода As.

Читать полностью…

Golang tests

👣 Go давно починил старую ловушку с замыканиями в цикле.

Но concurrency всё ещё может кусаться.

Что не так с этим кодом?


package main

import (
"fmt"
"sync"
)

func main() {
nums := []int{1, 2, 3, 4}

var wg sync.WaitGroup
result := make([]int, 0, len(nums))

for i, n := range nums {
wg.Go(func() {
result = append(result, i*n)
})
}

wg.Wait()

fmt.Println(result)
}


На первый взгляд всё нормально.

i и n уже не общие для всех итераций. В современном Go каждая итерация получает свои переменные, поэтому старого бага с замыканием тут нет.

Проблема в другом месте.

`append` меняет slice header и может трогать общий backing array. Несколько горутин делают это одновременно. Значит, здесь data race, даже если loop variables теперь безопасные.

Правильный вариант:

```go id="9f32ws"
package main

import (
"fmt"
"sync"
)

func main() {
nums := []int{1, 2, 3, 4}

var wg sync.WaitGroup
result := make([]int, len(nums))

for i, n := range nums {
wg.Go(func() {
result[i] = i * n
})
}

wg.Wait()

fmt.Println(result)
}
```

Теперь каждая горутина пишет в свой индекс.

Без mutex.
Без channel.
Без лишнего копирования переменных.

Хороший тест на то, понимаешь ли ты Go после 1.22, а не просто помнишь старую страшилку про closures.

Читать полностью…

Golang tests

Да, сейчас в новой версии уже будет
2
1
0
2
1
0
2
1
0

Читать полностью…

Golang tests

Разрабатываете на Go больше четырёх лет? Сразу 7 наших команд ждут вас:


Сервис Транспорта строит маршруты во всех продуктах 2ГИС, отображает пробки, дорожные события и автобусы на карте.

Social сотворяет магию вокруг социального графа.

Platform Backend Services превращает бизнес‑требования в платформенные сервисы: от идеи до запуска фич мобильными командами без лишних зависимостей.

Web API решает все справочные задачи, управляет стилями карт и обратной связью от пользователей в продуктах.

Сервис Рекламы создаёт техническую основу для продуктов рекламного направления.

2ГИС Логистика строит и пересчитывает маршруты с учётом пробок, погодных условий, типов транспорта, параметров груза и сложных логистических цепочек.

ГеоПоток помогает бизнесу повышать прозрачность процессов и сокращать издержки.

Все вакансии на сайте

Другие инженерные инсайты от 2ГИС → в Telegram-канале RnD

Читать полностью…

Golang tests

Привет а сколько час стоит

Читать полностью…

Golang tests

⚡️ Вышло большое обновление популярного курса- Ai AI агенты, которые реально работают в проде!

Вы всё ещё пишете обёртки над ChatGPT и называете это «AI-продуктом»?

Пока вы промптите - рынок переходит на агентные системы. Те, что принимают решения, ходят в API, работают с Postgres и Redis, управляют браузером через Playwright.

И 90% таких систем ломаются между ноутбуком и продом.

AI Agents Engineering - курс, который закрывает этот разрыв. LangGraph, AutoGen, Computer Use, LLMOps. 8 модулей, 120+ шагов - от архитектуры до деплоя в Docker.

На выходе: реальный опыт на большой практической базе, а production-агент и навыки, за которые уже платят.

👉 48 часов действует скидка на курс 55 процентов: https://stepik.org/a/276971/

Читать полностью…

Golang tests

Ебать ты разноцветный

Читать полностью…

Golang tests

Nil-интерфейс в Go: почему err == nil выдаёт false?


Nil-интерфейс в Go ломает даже опытных разработчиков: функция возвращает nil-указатель *E, а проверка err == nil всё равно даёт false. Причина в том, что интерфейс хранит пару из типа и значения, и пока тип *E на месте, интерфейс не считается пустым. Хочешь вернуть «нет ошибки», возвращай nil явно.

youtube.com/shorts/6LK-o-BSjHA?feature=share

Читать полностью…

Golang tests

Не застревайте в прошлом — учитесь новым навыкам и ИИ

Чтобы успевать за требованиями рынка, освойте новую профессию и нейросети в Практикуме. До 30 сентября действует скидка 16% на все курсы. 

Выбрать курс

Как всё устроено: 

— нейросети уже в каждом курсе: учим профессиям сразу с ИИ, чтобы ваше резюме было заметнее, а трудоустройство — увереннее;

— эксперты — практики, которые двигают ИИ-индустрию: перенимайте опыт у профи из Яндекса, Сбера, Т-Банка и других бигтех-компаний;

— воркшопы, которые успевают за изменениями: если сегодня завирусится новая нейросеть, то завтра вы сможете обсудить её с наставником.

Начните учиться бесплатно и получите скидку 16% — она автоматически появится в личном кабинете. 

Учиться!

Erid: 2SDnjbog3xP
Название: ООО "ЯНДЕКС"
ИНН: 7736207543

Читать полностью…

Golang tests

🔥 Хочешь расти в IT быстрее остальных? Перестань учиться в одиночку

Можно годами смотреть курсы, читать документацию и всё равно топтаться на месте.

А можно попасть в правильное окружение, где каждый день обсуждают новые инструменты, вакансии, реальные кейсы, ошибки и то, что уже завтра станет стандартом.

Здесь собраны папки и каналы по разным направлениям IT, чтобы ты быстрее находил нужных людей, идеи и полезный контент - без бесконечного поиска.

AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: /channel/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_ci
Java: t.me/javatg
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: /channel/gamedev
Haskell: t.me/haskell_tg

Собеседования и карьера:

DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview

Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: /channel/addlist/2Ls-snqEeytkMDgy
Папка Frontend: /channel/addlist/mzMMG3RPZhY2M2Iy

Полезное сверху:

ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: /channel/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy

Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg

Подпишись и сохрани, здесь регулярно появляются новые подборки, инструменты и материалы, которые реально помогают расти быстрее.

Читать полностью…

Golang tests

Go-задача: что выведет этот код?


package main

import "fmt"

func main() {
var funcs []func()

for i := range 3 {
funcs = append(funcs, func() {
fmt.Println(i)
})
}

for _, f := range funcs {
f()
}
}


Что будет в выводе?


A)

0
0
0

😎

2
2
2

C)

0
1
2

D) Код не скомпилируется


Правильный ответ: C — 0, 1, 2

Почему?

В современных версиях Go переменная цикла для каждой итерации получает отдельное значение для замыканий.

Плюс range теперь можно использовать прямо по integer:

```go
for i := range 3
```

Это даёт значения:

```go
0
1
2
```

Поэтому каждое замыкание запоминает своё i.

Несколько лет назад похожие примеры часто ломались из-за захвата одной общей переменной цикла, и разработчики писали:

```go
i := i
```
внутри цикла.

Хороший вопрос на собеседовании:

Почему этот код сегодня выводит 0, 1, 2, хотя раньше похожий пример мог вести себя иначе?

Читать полностью…

Golang tests

Задача Go 1.26, на которой легко ошибиться даже опытному разработчику

Что выведет этот код?


package main

import "fmt"

type Config struct {
Timeout *int
}

func main() {
a := Config{
Timeout: new(30),
}

b := a
*b.Timeout = 60

c := Config{
Timeout: new(*a.Timeout),
}
*c.Timeout = 90

fmt.Println(
*a.Timeout,
*b.Timeout,
*c.Timeout,
)
}


Попробуйте определить ответ до запуска.

```text
60 60 90
```

Почему?

```go
b := a
```

Структура копируется, но указатель внутри неё остаётся тем же. Поэтому `a.Timeout` и `b.Timeout` указывают на одну переменную:

```go
*b.Timeout = 60
```

Изменение видно через обе структуры.

А здесь создаётся уже новая переменная:

```go
Timeout: new(*a.Timeout)
```

Go сначала получает значение `60`, затем выделяет для него отдельную память. Поэтому изменение `c.Timeout` не влияет на `a` и `b`.

```text
a ─┐
├──► 60
b ─┘

c ─────► 90
```

Это важный нюанс: копирование структуры с указателями, слайсами или map не создаёт глубокую копию данных.

Синтаксис `new(30)` появился в **Go 1.26**. Раньше `new` принимал только тип, а теперь может сразу создать указатель на переданное значение.

Код актуален для последней стабильной версии **Go 1.26.5**.

#Golang #Go126 #Programming

Читать полностью…

Golang tests

🧠 Редкая задача для Go-разработчиков

Версия: Go 1.23+
Именно в Go 1.23 появился range по функциям-итераторам и пакет iter.

Нужно реализовать:


func MergeSorted(a, b iter.Seq[int]) iter.Seq[int]


Функция получает два ленивых отсортированных итератора и возвращает один общий поток в отсортированном порядке.

Пример:


a := Seq(1, 4, 7, 10)
b := Seq(2, 3, 8, 9)

for v := range MergeSorted(a, b) {
fmt.Println(v)
}


Результат:


1 2 3 4 7 8 9 10


Но есть условия:

* нельзя превращать входы в []int;
* нельзя использовать горутины и каналы;
* память должна быть O(1);
* если внешний цикл сделал break, оба исходных итератора должны прекратить работу;
* каждый элемент исходного iterator можно получить только один раз.

🔥 Дополнительный уровень: сделать generic-версию:


func MergeSorted[T cmp.Ordered](
a, b iter.Seq[T],
) iter.Seq[T]


На первый взгляд обычный merge. На практике придётся хорошо понять, как устроены push/pull iterators, `yield` и раннее завершение `range` в Go 1.23.

Читать полностью…

Golang tests

Интересно, но многие забывают, что `defer` в итераторе выполнится только после его завершения. Здесь `break` останавливает цикл, но `yield` больше не вызывается, и `defer` сработает только когда весь `numbers` завершится. Так что "iterator: defer" появится, но не сразу после `break`.

Читать полностью…

Golang tests

Согласен, окружение сильно ускоряет рост. Особенно когда видишь, как решают задачи реальные люди, а не синтетические примеры. Go-сообщество как раз такое - много практики, мало шума.

Читать полностью…

Golang tests

🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку

В IT прокачивается тот, кто каждый день видит сильные идеи, новые инструменты, реальные задачи, вакансии и разборы.

Окружение решает больше, чем кажется.

Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.

AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: t.me/DevopsDocker
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_1001_notes
Java: t.me/java_library
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: /channel/gamedev
Haskell: t.me/haskell_tg

Собеседования и карьера:

DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview

Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: /channel/addlist/2Ls-snqEeytkMDgy
Папка Frontend: /channel/addlist/mzMMG3RPZhY2M2Iy

Полезное сверху:

ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: @courses
ИТ-книги бесплатно: /channel/addlist/BkskQciUW_FhNjEy

Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg

Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.

Пока кто-то листает шум, ты будешь видеть инструменты, задачи и идеи, которые помогают расти в профессии.

Читать полностью…

Golang tests

А в старых версиях
2
1
0
3
3
3
2
1
0

Читать полностью…

Golang tests

👣 Golang-задача с подвохом

Версия: Go 1.23+

Что выведет код?


package main

import "fmt"

func numbers(yield func(int) bool) {
defer fmt.Println("iterator: defer")

for i := 0; i < 5; i++ {
if !yield(i) {
fmt.Println("iterator: stopped")
return
}

fmt.Println("iterator: after yield", i)
}
}

func main() {
for n := range numbers {
fmt.Println("main:", n)

if n == 2 {
break
}
}

fmt.Println("main: done")
}


Многие ждут, что после break итератор просто мгновенно исчезнет.

Но в Go 1.23 появился range по функции.

Под капотом yield возвращает false, если внешний цикл остановился через break.

Ответ:

```txt id="5glpxa"
main: 0
iterator: after yield 0
main: 1
iterator: after yield 1
main: 2
iterator: stopped
iterator: defer
main: done
```

Подвох в том, что `break` происходит во внешнем цикле, но функция-итератор получает сигнал остановки через `yield`.

Если не проверить `!yield(i)`, можно продолжить работу после того, как потребитель уже вышел из цикла.

Читать полностью…

Golang tests

⚙️ Лучшие практики в Go: кейсы, которые особенно ждём

С 1 июня у нас стартует новый сезон Podlodka Go Crew — «Лучшие практики в Go». Он пройдёт при поддержке 2ГИС. Будем говорить о том, как писать код, который нормально живёт в продакшене при росте нагрузки и команды.

Вот какие сессии в этом сезоне мы ждём с особенным вниманием:

🚀 «Практика Go оптимизаций: растем вместе с нагрузкой», Алексей Акулович — путь сервиса от прототипа до миллионов RPS, оптимизация CPU, grpc, protobuf и даже собственный GC поверх гошного.

🏗 «Эволюция структуры Go-проекта: как 30 человек пушат в один репозиторий», Кирилл Возжеников — про рост продуктового монорепозитория, построение системы и практики, которые помогают не утонуть в хаосе.

🧩 «Как и зачем писать свой CDC на Go», Юра Саргсян —
о ситуации, где стандартных решений уже недостаточно. Postgres, Kafka, гарантии доставки и и подводные камни логической репликации.

🔥 А в конце сезона проведём битву кейсов «50 оттенков межсервисного взаимодействия» — вместе разберём архитектурные задачи с метриками, схемами и ограничением на уточняющие вопросы.

👨‍💻 Будет много живых инженерных кейсов и обсуждений без абстракций. Приходите — будем разбирать реальные задачи и подходы, которые помогают строить надёжные системы.

🎟 Билеты здесь: https://podlodka.io/gocrew

Читать полностью…

Golang tests

результаты тестирования 🙄

Читать полностью…

Golang tests

Для тех, кто строит и масштабирует сервисы на Go: 25 апреля пройдет Я.Субботник по Go

Яндекс проведет митап офлайн в Санкт-Петербурге и онлайн. Участников будут ждать практические доклады, живые кейсы и решения, проверенные под нагрузкой.

Руководитель группы разработки Городских сервисов Владимир Тельбухов покажет, как наладить консистентность в интеграциях с внешними сервисами. А разработчик Yandex Cloud Иван Похабов, расскажет, как устроен GoBGP, какие баги в нём встречаются и как их исправляют в production. Полную программу выступлений можно найти на сайте.

Помимо докладов, для участников проведут круглые столы, квиз по Go, а также экскурсию по питерскому офису Яндекса, для которой офлайн-участникам потребуется предварительная регистрация.

👉 Регистрируемся

Читать полностью…

Golang tests

Странные варианты. Неважно, какие поля внутри, если в качестве ключа указатель) Так что 2 правильных ответа

Читать полностью…
Subscribe to a channel