[{"data":1,"prerenderedAt":114},["ShallowReactive",2],{"content:\u002F04-advanced\u002F00-intro":3},{"title":4,"description":5,"path":6,"body":7},"Введение в продвинутые темы Go","Этот модуль про границы языка и рантайма. Здесь появляются инструменты, которые редко нужны в прикладном коде каждый день, но сильно помогают понимать производительность, библиотеки, сериализацию, DI, низкоуровневые оптимизации и поведение памяти.","\u002F04-advanced\u002F00-intro",{"type":8,"value":9,"toc":107},"minimark",[10,14,17,29,32,37,61,64,66,70,76,79,81,85],[11,12,4],"h1",{"id":13},"введение-в-продвинутые-темы-go",[15,16,5],"p",{},[15,18,19,20,24,25,28],{},"Важно держать честный баланс: ",[21,22,23],"code",{},"reflect",", ",[21,26,27],{},"unsafe"," и тонкая настройка памяти не делают код автоматически сильнее. Они полезны, когда вы понимаете цену абстракции и можете объяснить, зачем выходите за простой путь.",[30,31],"hr",{},[33,34,36],"h2",{"id":35},"что-будет-внутри","Что будет внутри",[38,39,40,44,47,52,55,58],"ul",{},[41,42,43],"li",{},"дженерики: типовые параметры, constraints, когда они уместны;",[41,45,46],{},"рефлексия: runtime-информация о типах и значениях;",[41,48,49,51],{},[21,50,27],{},": что позволяет и какие гарантии снимает;",[41,53,54],{},"аллокатор памяти и связь с escape analysis;",[41,56,57],{},"сборщик мусора, паузы, давление на heap;",[41,59,60],{},"ООП в Go без наследования как центральной идеи.",[15,62,63],{},"Темы лучше читать как цепочку, а не как набор отдельных трюков. Дженерики помогают оставить проверки на этапе компиляции. Reflect переносит часть решений в runtime. Unsafe снимает часть гарантий языка. Аллокатор и GC объясняют, почему эти решения влияют не только на красоту API, но и на lifetime объектов, аллокации, паузы и давление на память.",[30,65],{},[33,67,69],{"id":68},"как-понять-что-модуль-освоен","Как понять, что модуль освоен",[15,71,72,73,75],{},"Вы можете выбрать между обычной функцией, интерфейсом, дженериком и рефлексией без религиозного спора. Вы понимаете, почему лишняя аллокация может быть проблемой, но не оптимизируете код до измерений. Вы знаете, что ",[21,74,27],{}," — это договор: больше возможностей в обмен на больше ответственности.",[15,77,78],{},"Хороший результат модуля — не желание переписать всё на дженериках, а способность спокойно читать сложный код и видеть, где сложность оправдана.",[30,80],{},[33,82,84],{"id":83},"рабочие-ориентиры","Рабочие ориентиры",[38,86,87,90,93,101,104],{},[41,88,89],{},"Сначала измерение, потом оптимизация.",[41,91,92],{},"Дженерики применяйте для повторяемой типобезопасной логики, а не для имитации классов.",[41,94,95,97,98,100],{},[21,96,23],{}," и ",[21,99,27],{}," должны быть спрятаны за маленьким, проверяемым API.",[41,102,103],{},"Если код нарушает обычную модель типов, рядом должен быть контракт: кто владеет памятью, кто может мутировать данные, сколько живёт указатель.",[41,105,106],{},"На ревью продвинутого кода спрашивайте не \"хитро ли написано\", а \"какую гарантию мы потеряли и чем её заменили\".",{"title":108,"searchDepth":109,"depth":109,"links":110},"",2,[111,112,113],{"id":35,"depth":109,"text":36},{"id":68,"depth":109,"text":69},{"id":83,"depth":109,"text":84},1781022064119]