Тёмные стороны Go — с разработчиком GoLand  | GoGetPodcast №18

Обсуждаем проблемные места Go с Арсением Тереховым — разработчиком из команды GoLand в JetBrains. Nil safety, слайсы, замыкания, shadowing и другие спорные места — разбираем, где в Go легко выстрелить себе в ногу и почему так происходит. Арсений смотрит на Go с необычного угла: он из мира Kotlin, но при этом погружён в Go глубже многих гоферов благодаря работе над GoLand. С другой стороны Глеб Яльчик и Дима Матрёничев — разработчики с колоссальным опытом в Go и в разработке в целом, у них есть глубокое понимание дизайна языка и различных тонкостей, которые вызывают у Арсения вопросы. Они и помогут нам разобраться почему сделано именно так. Что обсуждаем: — Nil safety в Go: почему это проблема и как с ней жить — Слайсы: append выглядит иммутабельно, но мутирует данные — Замыкания и горутины: классические баги с захватом переменных — Shadowing переменных: визуально не отличить, но приводит к багам — Data races при чтении слайсов Выпуск вышел при поддержке AvitoTech 💙 Статья про обработку ошибок в Go:
Telegram AvitoTech:
Митапы:
Состав: Николай Тузов Арсений Терехов — JetBrains, GoLand Team Глеб Яльчик Дмтрий Матрёничев, ведёт ТГ-канал по Go:
👾 Мой Телеграм-Канал с анонсами подкастов, роликов и др.:
🗣️ Наш чат - Gopher Club:
Все гости наших выпусков там присутствуют. Тайминги: 00:00 Вступление 00:27 Предыстория: вопросы от Арсения 02:00 Хорошая новость: новые выпуски теперь будут выходить регулярно 03:24 Gophercon West — как это было: 25 часов перелёта и визовый лайфхак 06:00 Футболки с конференций и брендинг 08:40 Тема #1: Nil safety — старт обсуждения 09:57 История: Тони Хоар, Algol и billion dollar mistake 11:41 Реальные кейсы: $100k loss и падение Google Cloud 14:52 Взгляд на проблему с экономической точки зрения 17:13 Nil как валидное значение указателя 20:05 История указателей: от ассемблера до высокоуровневых языков 25:04 Создатели Go: Rob Pike, Russ Cox, Ken Thompson 27:45 Дизайн языка — в чём идея? 29:33 Go пофиксил проблемы C/C++? 32:03 Философия Go: проверенные решения, а не новации 36:23 Семантика указателей в Go: nil-receiver как валидное состояние 39:11 Возможен nil safety с учётом рефлексии? 42:14 Привет бабушке! 42:44 Безопасен ли Go без unsafe/reflect? 48:34 Kotlin vs Java: где действительно есть null safety 51:07 Ограничения null safety: Spring, рефлексия, interop 53:00 Safe enough vs абсолютная безопасность 55:38 Итоги по nil pointer 59:00 Тема #2: Захват переменных — классический баг с циклами 01:02:28 Обратная совместимость: почему сложно что-то менять 01:05:23 Революция в тулинге языков программирования 01:07:51 Final в Java/Kotlin и почему этого нет в Go 01:13:11 Захват переменных в C++: явный синтаксис 01:16:01 Когда нужна запись в захваченные переменные 01:19:27 Каналы в Go: гарантии и практические сложности 01:25:21 Роль линтеров — go vet, staticcheck, golangci-lint 01:26:07 Тулинг: data-flow анализ, детектор гонок 01:29:21 Почему линтеры простые: философия дизайна 01:31:57 Тема #3: Слайсы — самая болезненная тема 01:32:23 Загадка про 8 слайсов и capacity 01:37:36 Проблемы дизайна слайсов в Go и почему так 01:40:15 Как работает append и реаллокация 01:47:03 Почему append возвращает значение? 01:56:52 Эволюция через тулинг: x/tools/modernize и автопочинка 02:00:17 Data races при конкурентном append 02:03:53 Тема #4: Shadowing переменных 02:09:54 Удобство vs однозначность кода 02:13:11 Философия дизайна языков и их эволюция 02:17:00 Выводы 02:22:03 Каждый новый язык лучше? 02:29:07 Относительность решений в программировании 02:33:59 Теорема Гёделя о неполноте 02:34:53 Аналогия с Nintendo: простота как фича 02:36:33 Аналогия с физикой: разные модели для разных масштабов 02:37:25 Заключение #gogetpodcast

Смотрите также