Может ли быть GO лучше для реализации серверной части веб-приложения, чем C++ ?
Для С++ есть множество реализаций веб-сервера (например, тот же drogon-core), в которых реализовано всё, что только нужно: от управления сессиями пользователей и до маршрутизации запросов.
Так же С++ может предложить множество самых разных библиотек и возможностей самого языка: создание классов и поддержание полиморфизма, отличные иерархии с помощью наследований, разнообразные типы данных (тот же enum class) и контейнеры.
В GO это всё тоже есть, но на минимальном уровне.
Хочу использовать множества (set) - а не получится. Используй map.
Хочу использовать шаблонный класс - не в этот раз. Реализуй всё отдельно.
Хочу реализовать возвращаемое значение как enum - надо пользоваться константами.
И много остальных нюансов, больше всего расстраивает отсутствие ООП как такового.
Так может быть, С++ и фреймворки всё-таки будет по-лучше?
Для чего GOlang может подходить лучше, чем С++? Для интернет-магазинов? Маркет-плейсов? Микросервисов? Лендингов?
C/C++
Есть ли преимущества написания серверной части на GOlang, чем на С++ ?
Главные достоинства Go:
1. Go-код надёжнее C++-кода (при одинаковом уровне квалификации кодеров), т. к. в нем нет UB и бесконтрольного доступа к памяти.
2. В языке Go нет ничего лишнего. В нём не надо выбирать между десятью конструкциями, делающими почти одно и тоже.
3. Go-код проще и понятнее. Да, ценой незначительного увеличения объёма этого кода, но на реальных проектах, которыми занимаются множество разработчиков, читабельность кода куда важнее возможности разработчика при наборе кода нажать на несколько клавиш меньше.
Что касается set, то простой вопрос: ты знаешь как этот set (который не является встроенным типом, а реализуется шаблонным классом) устроен и какую вычислительную сложность имеют операции с множествами в C++? Используя map в Go я знаю ответ на этот вопрос. А ты - используя set в C++?
И ошибаешься, ООП в Go есть - только построенное не на наследовании, а на композиции. Надо понимать, что C++ -это не ООП, а всего лишь один из множества вариантов ООП, и придуманная Страуструпом мантра "полиморфизм, инкапсуляция наследование" никак не отражает реальное ООП в других ООП-языках.
В Go тоже множество самых разнообразных пакетов. На том же github ты найдёшь пакеты на все случаи жизни. И если в Go тебя не устраивают возможности встроенного в язык сервера, ты всегда можешь взять на github пакет любого из множества популярных серверов, обладающих куда более широкими возможностями. Но, уверен - ни одного Go-фреймворка ты использовать не пробовал.
И c полиморфизмом в Go всё прекрасно. А то, что ООП без наследования - так это не недостаток, а преимущество: полиморфизм через множественное наследование создаёт намного больше проблем, чем решает. Не зря же разработчики Java, C# и множества других современных языков с ООП, основанном на классах, выбросили множественное наследование на помойку и ввели интерфейсы - которые не наследование, а контракт.
Да, обобщённое программирование в Go (те самые шаблоны) появятся только в следующем году. Но есть кодогенератор, который позволяет не писать код руками, а перекладывать автоматическую его генерацию на компилятор.
Для лендингов и большинства интернет-магазинов (не берём гиганты) намного больше подходит PHP, чем C++. В web-разработке в принципе нет задач, для которых наилучшим выбором будет C++: хотя бы потому, что разработка на C++ -это неоправданно дорого и даёт лишь ничтожную прибавку в производительности (и только при использовании разработчиков соответствующего уровня).
С++ -не язык для написания back-end, а язык для написания инструментов для создания back-end. Использование С++ в back-end - экзотика, а не общепринятая практика.
Go прекрасно подходит для многих задач прикладного уровня. В частности, для высоконагруженного back-end, но далеко не только для web. И, например, Docker - это Go с небольшой добавкой Rust.
1. Go-код надёжнее C++-кода (при одинаковом уровне квалификации кодеров), т. к. в нем нет UB и бесконтрольного доступа к памяти.
2. В языке Go нет ничего лишнего. В нём не надо выбирать между десятью конструкциями, делающими почти одно и тоже.
3. Go-код проще и понятнее. Да, ценой незначительного увеличения объёма этого кода, но на реальных проектах, которыми занимаются множество разработчиков, читабельность кода куда важнее возможности разработчика при наборе кода нажать на несколько клавиш меньше.
Что касается set, то простой вопрос: ты знаешь как этот set (который не является встроенным типом, а реализуется шаблонным классом) устроен и какую вычислительную сложность имеют операции с множествами в C++? Используя map в Go я знаю ответ на этот вопрос. А ты - используя set в C++?
И ошибаешься, ООП в Go есть - только построенное не на наследовании, а на композиции. Надо понимать, что C++ -это не ООП, а всего лишь один из множества вариантов ООП, и придуманная Страуструпом мантра "полиморфизм, инкапсуляция наследование" никак не отражает реальное ООП в других ООП-языках.
В Go тоже множество самых разнообразных пакетов. На том же github ты найдёшь пакеты на все случаи жизни. И если в Go тебя не устраивают возможности встроенного в язык сервера, ты всегда можешь взять на github пакет любого из множества популярных серверов, обладающих куда более широкими возможностями. Но, уверен - ни одного Go-фреймворка ты использовать не пробовал.
И c полиморфизмом в Go всё прекрасно. А то, что ООП без наследования - так это не недостаток, а преимущество: полиморфизм через множественное наследование создаёт намного больше проблем, чем решает. Не зря же разработчики Java, C# и множества других современных языков с ООП, основанном на классах, выбросили множественное наследование на помойку и ввели интерфейсы - которые не наследование, а контракт.
Да, обобщённое программирование в Go (те самые шаблоны) появятся только в следующем году. Но есть кодогенератор, который позволяет не писать код руками, а перекладывать автоматическую его генерацию на компилятор.
Для лендингов и большинства интернет-магазинов (не берём гиганты) намного больше подходит PHP, чем C++. В web-разработке в принципе нет задач, для которых наилучшим выбором будет C++: хотя бы потому, что разработка на C++ -это неоправданно дорого и даёт лишь ничтожную прибавку в производительности (и только при использовании разработчиков соответствующего уровня).
С++ -не язык для написания back-end, а язык для написания инструментов для создания back-end. Использование С++ в back-end - экзотика, а не общепринятая практика.
Go прекрасно подходит для многих задач прикладного уровня. В частности, для высоконагруженного back-end, но далеко не только для web. И, например, Docker - это Go с небольшой добавкой Rust.
Похожие вопросы
- Нужна помощь с написанием кода на языке "С"
- C++.Нужна помощь в написании кода.
- Помогите с написанием программы в компиляторе на С++
- Каковы преимущества и недостатки использования "ДЕК"
- Написание программы на c++
- Написание программы C++ Массивы
- Возникла проблема при написании кода (с++). Помогите пожалуйста.
- Посмотрите пожалуйста правильность написания кода С++
- Помощь с написанием программы
- Помощь с написанием программы
По поводу set я с вами согласен. В std::set, при добавлении данных, если они совпадают, прежние данные удаляются, а новые записываются. Лучше тогда использовать std::contains перед добавлением.
std::map при совпадении вызовет инкремент, а при отсутствии добавит элемент в контейнер. Это быстрее.
Согласен, что форматирование GO кода действительно напорядок улучшает читабельность и понимание кода: он везде выглядит одинаково.
Может быть, мне GO непривычен только потому, что я ещё только учусь и не очень хорошо в нём разобрался.
Но сейчас из того, что меня сильно раздражает - это проверка на ошибку после каждого вызова функции (ну, почти). Вызвал функцию - проверил на ошибку
В стандартной библиотеке какой-то ужас с форматированием даты.
Многопоточность и каналы хорошо придуманы, но мне кажется, что-то подобное можно сделать во многих языках, если написать соответствующую библиотеку.