Skip to content
Examples of calls between Go and C/C++ (and how to call a Go shared object from Node/Ruby/Python/Java)
Branch: master
Clone or download
draffensperger Merge pull request #1 from stroxler/master
Fix broken dynamic library compile on osx
Latest commit 8f58eba Apr 13, 2017
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
benchmarks
c_to_go
dyn_langs_to_go
go_to_c
go_to_cxx
.gitignore
BostonGolangTalkSlides.pdf
README.md
welcome.go

README.md

Go interlanguage call examples

Examples of calls between Go and C/C++ and calling Go from dynamic languages.

The examples are designed to work on Mac and Linux. If you're using Windows, feel free to reach out to me to request updates for examples that don't work correctly.

Calls from Go to C (go_to_c folder)

These examples use cgo to enable calls to C.

  • Calling a C snippet in the cgo comment: c_in_comment
  • Calling a C statically-linked library (.a file): static_c_lib
  • Calling a C dynamically-linked library (.so or .dylib): dynamic_c_lib

Calls from Go to C++ (go_to_cxx folder)

C++ has more complex calling conventions (e.g. function overloading, inheritance, templates) and so it uses name mangling which adds a step when calling it from Go. Below are ways to do it.

  • Calling C++ via a C wrapper function: c_wrapper
  • Calling C++ via an auto-generated SWIG wrapper: swig

Calls from C/C++ to Go (c_to_go folder)

Calls from Python/Node.js/Ruby/Java to Go (dyn_langs_to_go folder)

Go now allows building a C-compatible dynamically-linked library with buildmode=c-shared. That allows any language that can call C dynamic libraries to call Go.

Cross-language call benchmarks

There is a cost to calling between languages a Go to C call is about 50x slower than a pure Go call and a Ruby FFI call is about 30x slower than a pure Ruby call. For more details, see the benchmarks section.

Helpful Links

Cgo documentation: golang.og/cmd/cgo/

Documentation for go command (see especially go build section and "Calling between Go and C"): golang.org/cmd/go/

SWIG Documentation: swig.org

SWIG Go examples: github.com/swig/swig/tree/master/Examples/go

Gccgo documentation: golang.org/doc/install/gccgo

License

The code in this repo is MIT Licensed.

You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.