Категория: Go (Golang)

Go (Golang) — новый и набирающий популярность язык от компании Google. Разрабатывался как язык для создания высокоэффективных программ, работающих на распределённых системах и многоядерных процессорах. В данной категории публикуются статьи о тонкостях практического применения языка Go для написания больших коммерческих проектов.

Отличительные особенности

Go имеет общие черты с C, C++, C#. Как и C / C++ он предоставляет полную поддержку работы с указателями. При этом, арифметические операции с указателями, порой приводящие к ошибкам при использовании C / C++, не реализованы. Визитная карточка языка — это так называемые Go-рутины (go routine) и каналы (channels).

Go-рутины и каналы

Go rutine — это функция, которая вызывается асинхронно (в другом потоке) и выполняется параллельно с другими функциями. Для обмена данными между Go-рутинами используются каналы. Каналы могут использоваться и для синхронизации Go-рутин между собой и с запустившей их процедурой. Для работы с каналами введен оператор select, являющийся аналогом switch в языках программирования C и C++. Возможно создание каналов с буферизацией.

Передача строки из функции на Go в код на C без выделения памяти (часть 2)

В прошлой статье мы обсуждали возможность передачи строки без выделения памяти. При попытке использовать этот метод в реальных проектах выяснилось, что есть случаи, когда метод неприменим. Все работает отлично, если объект string был сконструирован из статической строковой константы или конкатенацией констант. Если же string представляет собой результат объединения других объектов, при выполнении программы произойдет исключение: mystr :=

Передача строки без выделения памяти из функции на Go в код на C (часть 1)

Документация по CGO весьма скудно освещает вопрос передачи строк. Сказано только одно – используйте функцию C.CString() для преобразования объекта string в понятный коду на C указатель на буфер со строкой, завершенной нулем — char*. Все хорошо, но при этом выделяется блок памяти (malloc), который необходимо удалять вызовом (free), закончив его использование. Несколько расточительно, если функцию