Сравнение Python и Golang
Фича | Python | Golang |
---|---|---|
Функциональный сахар, типа map, filter | + | - |
Возможность написать 2 утилиты, которые могут лежать и запускаться в 1 папке | + | - |
REPL | + | - |
Легко закомментировать половину кода для отладки (в Go будут ошибки imported and not used. Go-plus в Atom удаляет неиспользуемые импорты при сохранении. Добавляешь принты дебаговые, с помощью fmt, комментишь, сохраняешь, import fmt удаляется, раскомментируешь - ошибки) | + | - |
Компилируемость даёт большой выигрыш в производительности | - | - |
Возможность x, y = func() , которая возвращает список из двух строк |
+ | - |
Необходимость писать свой urllib при шаге влево/вправо | - | + |
Строгий urllib падает с ошибками разбора URL вида http://example.com/x/% |
- | + |
Богатая библиотека для работы со строками (в Go нет find() с offset, isUpper() , isLower() ) |
+ | - |
Min() и Max() работают для любых числовых типов |
+ | - |
Деплой 1 бинариком | - | + |
Навязывание layout мотивирует не делить код на модули | - | + |
Удаление элемента из slice по индексу логично (в Python - del, в Go - создание нового списка через сложение подслайсов сбоку и справа от элемента) | + | - |
Поддержка дефолтных значений в getenv() |
+ | - |
Возможность использовать пустую строку в условии как false (в Go надо считать их длину) | + | - |
Бенчмарки хороши | + | + |
Парсер YAML требует строгой типизации файла. Не поймёшь в какую структуру его парсить, пока не распарсишь. Успех парсинга зависит от именования поля структуры, причём не 1 в 1. То, что в YAML зовётся “consumer” в коде Go должно называться Consumer | - | + |
Примечания
Самый умный совет по оптимизации:
@strangeqargo: все равно надо на код смотреть, может у тебя контейнеры неоптимальные в питоне
Забавно, но код
s = “string”
s[len(s)-1] == “g”
быстрее в 8 раз, чем
s = “string”
strings.HasSuffix(s, “g”)
Удивил порядок разницы, я думал будет что-то около 1.5-3 раз.
А 1 python-функция на 23 строчки превратилась в 4 Go-функции на 130 строк.