Cgo khá chậm, bởi vì Go phải mess with its runtime and calling conventions theo những cách nhất định để gọi hàm C. Nơi duy nhất nó thực sự có giá trị nó là trường hợp thời gian tính toán đáng kể lùn this cost. Nó tương tự như song song, phân phối, GPU và như vậy lập trình, mặc dù với chi phí khởi động thấp hơn một chút.
Lắp ráp tốt hơn nhiều, vì bạn có thể viết lắp ráp sử dụng quy ước gọi của Go và được xử lý như mã Go gốc, nhưng lắp ráp ít di động hơn, khó đọc hơn và bảo trì nhiều hơn. Trong thực tế, thư viện chuẩn Go viết một số gói math
và big
trong gói 9 kiểu.
Gonum là ví dụ về cả hai loại này. Nó sử dụng lắp ráp chung cho một số chức năng có thể được thực hiện nhanh hơn theo cách đó, nhưng nó cũng thúc đẩy blas và động cơ lapack. Nó cung cấp một triển khai thực hiện Go-blas
, nhưng C-blas (thường là cuối cùng là Fortran-blas) là nhanh hơn, và đối với các phép tính ma trận lớn hầu như luôn luôn làm giảm chi phí rời khỏi Go.
Nói chung, bạn muốn tránh cgo khi có thể. Chỉ sử dụng nó khi cần thời gian tính toán quan trọng, hoặc bạn cần tương tác với những thứ không tầm thường để tương tác với Go thuần túy, chẳng hạn như đồ họa hoặc trình điều khiển âm thanh hoặc truy cập các thư viện phổ biến như OpenCV. Thậm chí sau đó, nếu bạn thực sự quan tâm đến hiệu suất, nếu có thể nó sẽ đáng để thực hiện một số loại "gọi tổng hợp", nơi bạn có thể lên lịch nhiều cuộc gọi từ phía Bên và thực hiện tất cả cùng một lúc bằng một chuyển ngữ cảnh sang C.
Chỉnh sửa: Đối với C++, có một số vấn đề quan trọng. Nó có thể khó khăn để bọc một số thư viện mà không có một số lớp trừu tượng (vì cgo không thể xử lý bao gồm các tiêu đề C++ đúng cách). Ngoài ra, các lớp C++ với destructors không thực sự được trả về bởi giá trị và phải được cấp phát trên heap. Vì Go không cho phép xác định tài nguyên xác định, bạn phải cung cấp chức năng để giải phóng bộ nhớ một cách rõ ràng và người dùng Go phải nhớ giải phóng tài nguyên.(Có một chức năng mà bạn có thể đọc trong tài liệu gọi là runtime.SetFinalizer
nhưng tôi không thể nói rằng tôi từng thấy bất kỳ ai sử dụng nó, và tài liệu tự nó đi kèm với một loạt các cảnh báo)
Chức năng như defer
làm điều này dễ quản lý hơn, nhưng nó làm hỏng rất nhiều thứ như RAII làm cho các thực hành C++ hiện đại an toàn hơn.
Rất có thể chỉ để sử dụng lại được. Hầu hết các thư viện lớn (chưa kể OS) có một ràng buộc C, do đó, có khả năng gọi C từ ngôn ngữ của bạn là một chiến thắng lớn cho việc áp dụng ngôn ngữ. – Dan