Еще мне в go нравится тотальная нулабельность.
Вернее, не совсем так.
Меня бесит, что #LLM вставляют ненужные проверки на nil. Связано это с тем, что эти ленивые твари очень не любят рефакторить тесты, и то и дело норовят подсунуть nil в качестве нового поля, со всемы вытекающими. Борюсь с этим постоянно, устраиваю регулярные забеги на код, но увы.
Но мне очень в кайф то, что nil мапа/массив/chan/etc - это валидные состояния этих структур данных, со вполне определенными операциями над ними - можно разыменовать nil мапу на чтение, можно взять длину, и так далее.
Поэтому в go, если ты получил от аллокатора зануленный блок памяти под структуру (а в go он всегда занулен), то этот кусок памяти автоматически является валидным объектом любого типа! Это не случайное свойство, оно является частью дизайна языка и runtime.
Вы себе не представляете, какое это классное свойство для языка для разработки на нем высокопроизводительного кода!
Не верите - посмотрите как-нить на ассемблер сгенеренного С++ компилятором сложного конструктора, и сравните это с "чистым" (и очень быстрым!) memset от go!
Кстати, из этого свойства следует много других прикольных свойств, типа очень эффективные пулы "почти готовых" объектов, но не буду сейчас на этом останавливаться.
Post #4180
3.23K
commit -m "better" Я абсолютно серьезно убежден, что go runtime - шедевр программной инженерии. Это, эээ, памятник мыслям лучших умов нашей эпохи (кстати, а я писал, что я большой фанат Russ Cox?).
- 🔥 42
- 🤡 25
- 👍 13
- ❤ 10
- 🤮 6
- 👎 5
- 😁 3
- 🐳 2
- 🆒 1