вторник, 21 ноября 2017 г.

Golang internals

        За что я люблю Golang - так это за то что ему сравнительно легко заглянуть под капот. Golang это единственный известный мне язык программирования runtime которого написан на нем самом а не на C(на 99%,  там есть немного ассемблера). То есть барьер между написанием программ на языке Go и заглядыванием внутрь - сильно ниже чем у того же PHP или Python. 
    Заглянув в runtime/стандартную библиотеку ты получаешь гораздо более глубокое понимание того как на самом деле работают приложения написанные на Golang. Там очень много красивых решений, которым можно поучится. Вообще когда ты читаешь как реализованы production class решения, ты на многие вещи начинаешь смотреть по другому.
         К примеру сортировка. Существует многие десятки алгоритмов сортировки, какой из них выбрать? Казалось бы - смотри на Big O и выбирай. Но это теория. А на практике оказывается что за счет малой константы многие алгоритмы с O(n2) оказываются быстрее чем алгоритмы гарантирующие O(n log n) даже в худшем случае. В общем кому интересно как работает встроенная в Golang сортировка можно почитать здесь: - https://golang.org/src/sort/sort.go  
          Другой пример - реализация map. Как на самом деле реализован тип map ? Какая хэш функция там используется ? Какой первоначальный размер хэш таблицы ? Как он увеличивается с ростом количества данных в map ? Если вам также интересно как и мне - то ответы на все вопросы можно найти здесь - https://golang.org/src/runtime/hashmap.go