Полагаю, вы имеете в виду код C, скомпилированный с помощью gcc?
IIRC, это либо невозможно, либо нелегко сделать, используя 6g + cgo и друзей. Go использует другое соглашение о вызовах (а также сегментированные стеки и т. Д.).
Однако вы можете написать C-код для [685] c (или даже [685] a) и легко вызвать go с помощью package · function () (вы даже можете вызвать методы IIRC). См. Источник пакета runtime
для примеров.
Обновление:
Возвращаясь к этому вопросу после обновления, и немного подумав. Это нельзя сделать стандартным способом, используя 6c или cgo. Тем более, что потоки не запускаются во время выполнения go, текущая реализация не будет выполнена. У планировщика внезапно окажется под контролем поток, о котором он не знает; Кроме того, в этом потоке будут отсутствовать некоторые локальные переменные потока, используемые средой выполнения go для управления стеками и некоторыми другими вещами. Кроме того, если функция go возвращает значение (или несколько), код C не может получить к нему доступ на поддерживаемых в настоящее время платформах, так как go возвращает значения в стеке (хотя вы можете получить к ним доступ с помощью сборки). Имея это в виду, я верю, что вы все еще можете сделать это, используя каналы. Это потребовало бы, чтобы ваш код на C был слишком тесно связан с внутренней работой среды выполнения go, но это сработало бы для данной реализации. Хотя использование каналов может оказаться не тем решением, которое вам нужно, оно может лучше соответствовать концепциям Go, чем обратным вызовам. Если ваш код на C переопределил по крайней мере методы отправки в Реализация канала (этот код написан для 6c, поэтому он, скорее всего, должен быть адаптирован для gcc, и он вызывает среду выполнения go, которую мы ' Если вы решили, что это невозможно сделать из непроходного потока), вы должны иметь возможность заблокировать канал и передать ему значение. Планировщик go может продолжать управлять своими собственными потоками, но теперь он может получать данные из других потоков, запущенных в C.
Правда, это хак; Я не посмотрел достаточно близко, но, вероятно, потребовалось бы несколько других хаков, чтобы заставить его работать (я полагаю, что сами каналы поддерживают список ожидающих их программ [РЕДАКТИРОВАТЬ: подтверждено: runtime·ready(gp);
], так что вы Вам нужно что-то в вашем коде go, чтобы разбудить принимающий канал или гарантировать, что код go не будет получен на канале, пока вы уже не введете значение). Однако я не вижу причин, по которым это не может работать, в то время как есть определенные причины, по которым выполнение кода, сгенерированного 6g, в потоке, созданном в C, не может.
Хотя мой первоначальный ответ остается в силе: без добавления языка или среды выполнения, это еще не может быть сделано так, как вы хотели бы (я бы хотел, чтобы вас здесь не подтвердили).