<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>SWIG and Go</title>
<link rel="stylesheet" type="text/css" href="style.css">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body bgcolor="#FFFFFF">
<H1><a name="Go">25 SWIG and Go</a></H1>
<!-- INDEX -->
<div class="sectiontoc">
<ul>
<li><a href="#Go_overview">Overview</a>
<li><a href="#Go_examples">Examples</a>
<li><a href="#Go_running_swig">Running SWIG with Go</a>
<ul>
<li><a href="#Go_commandline">Go-specific Commandline Options</a>
<li><a href="#Go_outputs">Generated Wrapper Files</a>
</ul>
<li><a href="#Go_basic_tour">A tour of basic C/C++ wrapping</a>
<ul>
<li><a href="#Go_package">Go Package Name</a>
<li><a href="#Go_names">Go Names</a>
<li><a href="#Go_constants">Go Constants</a>
<li><a href="#Go_enumerations">Go Enumerations</a>
<li><a href="#Go_classes">Go Classes</a>
<ul>
<li><a href="#Go_class_memory">Go Class Memory Management</a>
<li><a href="#Go_class_inheritance">Go Class Inheritance</a>
</ul>
<li><a href="#Go_templates">Go Templates</a>
<li><a href="#Go_director_classes">Go Director Classes</a>
<ul>
<li><a href="#Go_director_example_cpp_code">Example C++ code</a>
<li><a href="#Go_director_enable">Enable director feature</a>
<li><a href="#Go_director_ctor_dtor">Constructor and destructor</a>
<li><a href="#Go_director_overriding">Override virtual methods</a>
<li><a href="#Go_director_base_methods">Call base methods</a>
<li><a href="#Go_director_subclass">Subclass via embedding</a>
<li><a href="#Go_director_finalizer">Memory management with runtime.SetFinalizer</a>
<li><a href="#Go_director_foobargo_class">Complete FooBarGo example class</a>
</ul>
<li><a href="#Go_primitive_type_mappings">Default Go primitive type mappings</a>
<li><a href="#Go_output_arguments">Output arguments</a>
<li><a href="#Go_adding_additional_code">Adding additional go code</a>
<li><a href="#Go_typemaps">Go typemaps</a>
</ul>
</ul>
</div>
<!-- INDEX -->



<p>
This chapter describes SWIG's support of Go.  For more information on
the Go programming language
see <a href="http://golang.org/">golang.org</a>.
</p>

<H2><a name="Go_overview">25.1 Overview</a></H2>


<p>
Go does not support direct calling of functions written in C/C++.  The
<a href="https://golang.org/cmd/cgo/">cgo program</a> may be used to generate
wrappers to call C code from Go, but there is no convenient way to call C++
code.  SWIG fills this gap.
</p>

<p>
There are (at least) two different Go compilers.  The first is the gc compiler
of the <a href="https://golang.org/doc/install">Go distribution</a>, normally
invoked via the <a href="https://golang.org/cmd/go/">go tool</a>.
The second Go compiler is the <a href="https://golang.org/doc/install/gccgo">
gccgo compiler</a>, which is a frontend to the GCC compiler suite.
The interface to C/C++ code is completely different for the two Go compilers.
SWIG supports both Go compilers, selected by the <tt>-gccgo</tt> command line
option.
</p>

<p>
Go is a type-safe compiled language and the wrapper code generated by SWIG is
type-safe as well.  In case of type issues the build will fail and hence SWIG's
<a href="Modules.html#Modules_nn2">runtime library</a> and
<a href="Typemaps.html#Typemaps_runtime_type_checker">runtime type checking</a>
are not used.
</p>

<H2><a name="Go_examples">25.2 Examples</a></H2>


<p>
Working examples can be found in the
<a href="https://github.com/swig/swig/tree/master/Examples/go">SWIG source tree
</a>.
</p>

<p>
Please note that the examples in the SWIG source tree use makefiles with the .i
SWIG interface file extension for backwards compatibility with Go 1.
</p>


<H2><a name="Go_running_swig">25.3 Running SWIG with Go</a></H2>


<p>
Most Go programs are built using the <a href="https://golang.org/cmd/go/">go
tool</a>.  Since Go 1.1 the go tool has support for SWIG.  To use it, give your
SWIG interface file the extension .swig (for C code) or .swigcxx (for C++ code).
Put that file in a GOPATH/src directory as usual for Go sources.  Put other
C/C++ code in the same directory with extensions of .c and .cxx.  The
<tt>go build</tt> and <tt>go install</tt> commands will automatically run SWIG
for you and compile the generated wrapper code.  To check the SWIG command line
options the go tool uses run <tt>go build -x</tt>.  To access the automatically
generated files run <tt>go build -work</tt>.  You'll find the files under the
temporary WORK directory.
</p>

<p>
To manually generate and compile C/C++ wrapper code for Go, use the <tt>-go</tt>
option with SWIG.  By default SWIG will generate code for the Go compiler of the
Go distribution.  To generate code for gccgo, you should also use the
<tt>-gccgo</tt> option.
</p>

<p>
When using the <tt>-cgo</tt> option, SWIG will generate files that can be used
directly by <tt>go build</tt>.  Starting with the Go 1.5 distribution the
<tt>-cgo</tt> option has to be given.  Put your SWIG interface file in a
directory under GOPATH/src, and give it a name that does <b>not</b> end in the
.swig or .swigcxx extension.  Typically the SWIG interface file extension is .i
in this case.
</p>

<div class="code"><pre>
% swig -go -cgo example.i
% go install
</pre></div>

<p>
You will now have a Go package that you can import from other Go packages as
usual.
</p>

<p>
To use SWIG without the <tt>-cgo</tt> option, more steps are required.  Recall
that this only works with Go versions before 1.5.  When using Go version 1.2 or
later, or when using gccgo, the code generated by SWIG can be linked directly
into the Go program.  A typical command sequence when using the Go compiler of
the Go distribution would look like this:
</p>

<div class="code"><pre>
% swig -go example.i
% gcc -c code.c    # The C library being wrapped.
% gcc -c example_wrap.c
% go tool 6g example.go
% go tool 6c example_gc.c
% go tool pack grc example.a example.6 example_gc.6 code.o example_wrap.o
% go tool 6g main.go
% go tool 6l main.6
</pre></div>

<p>
You can also put the wrapped code into a shared library, and when using the Go
versions before 1.2 this is the only supported option.  A typical command
sequence for this approach would look like this:
</p>

<div class="code"><pre>
% swig -go -use-shlib example.i
% gcc -c -fpic example.c
% gcc -c -fpic example_wrap.c
% gcc -shared example.o example_wrap.o -o example.so
% go tool 6g example.go
% go tool 6c example_gc.c
% go tool pack grc example.a example.6 example_gc.6
% go tool 6g main.go  # your code, not generated by SWIG
% go tool 6l main.6
</pre></div>


<H3><a name="Go_commandline">25.3.1 Go-specific Commandline Options</a></H3>


<p>
These are the command line options for SWIG's Go module.  They can
also be seen by using:
</p>

<div class="code"><pre>
swig -go -help
</pre></div>

<table summary="Go-specific options">
<tr>
<th>Go-specific options</th>
</tr>

<tr>
<td>-cgo</td>
<td>Generate files to be used as input for the Go cgo tool.  This
  option is required for Go 1.5 and later, and works for Go 1.2 and
  later.  In the future this option will likely become the
  default.</td>
</tr>

<tr>
<td>-intgosize &lt;s&gt;</td>
<td>Set the size for the Go type <tt>int</tt>.  This controls the size
  that the C/C++ code expects to see.  The &lt;s&gt; argument should
  be 32 or 64.  This option is currently required during the
  transition from Go 1.0 to Go 1.1, as the size of <tt>int</tt> on
  64-bit x86 systems changes between those releases (from 32 bits to
  64 bits).  In the future the option may become optional, and SWIG
  will assume that the size of <tt>int</tt> is the size of a C
  pointer.</td>
</tr>

<tr>
<td>-gccgo</td>
<td>Generate code for gccgo.  The default is to generate code for
  the Go compiler of the Go distribution.</td>
</tr>

<tr>
<td>-package &lt;name&gt;</td>
<td>Set the name of the Go package to &lt;name&gt;.  The default
  package name is the SWIG module name.</td>
</tr>

<tr>
<td>-use-shlib</td>
<td>Tell SWIG to emit code that uses a shared library.  This is only
  meaningful for the Go compiler of the Go distribution, which needs to know at
  compile time whether a shared library will be used.</td>
</tr>

<tr>
<td>-soname &lt;name&gt;</td>
<td>Set the runtime name of the shared library that the dynamic linker
  should include at runtime.  The default is the package name with
  ".so" appended.  This is only used when generating code for
  the Go compiler of the Go distribution; when using gccgo, the equivalent name
  will be taken from the <code>-soname</code> option passed to the linker.
  Using this option implies the -use-shlib option.</td>
</tr>

<tr>
<td>-go-pkgpath &lt;pkgpath&gt;</td>
<td>When generating code for gccgo, set the pkgpath to use.  This
  corresponds to the <tt>-fgo-pkgpath</tt> option to gccgo.</td>
</tr>

<tr>
<td>-go-prefix &lt;prefix&gt;</td>
<td>When generating code for gccgo, set the prefix to use.  This
  corresponds to the <tt>-fgo-prefix</tt> option to gccgo.
  If <tt>-go-pkgpath</tt> is used, <tt>-go-prefix</tt> will be
  ignored.</td>
</tr>

</table>


<H3><a name="Go_outputs">25.3.2 Generated Wrapper Files</a></H3>


<p>There are two different approaches to generating wrapper files,
  controlled by SWIG's <tt>-cgo</tt> option.  The <tt>-cgo</tt> option
  works with Go version 1.2 or later.  It is required when using Go
  version 1.5 or later.</p>

<p>With or without the <tt>-cgo</tt> option, SWIG will generate the
  following files when generating wrapper code:</p>

<ul>
<li>
MODULE.go will contain the Go functions that your Go code will call.
These functions will be wrappers for the C++ functions defined by your
module.  This file should, of course, be compiled with the Go
compiler.
</li>
<li>
MODULE_wrap.c or MODULE_wrap.cxx will contain C/C++ functions will be
invoked by the Go wrapper code.  This file should be compiled with the
usual C or C++ compiler.
</li>
<li>
MODULE_wrap.h will be generated if you use the directors feature.  It
provides a definition of the generated C++ director classes.  It is
generally not necessary to use this file, but in some special cases it
may be helpful to include it in your code, compiled with the usual C
or C++ compiler.
</li>
</ul>

<p>When neither the <tt>-cgo</tt> nor the <tt>-gccgo</tt> option is
  used, SWIG will also generate an additional file:</p>

<ul>
<li>
MODULE_gc.c will contain C code which should be compiled with the C
compiler distributed as part of the gc compiler.  It should then be
combined with the compiled MODULE.go using go tool pack.
</li>
</ul>


<H2><a name="Go_basic_tour">25.4 A tour of basic C/C++ wrapping</a></H2>


<p>
By default, SWIG attempts to build a natural Go interface to your
C/C++ code.  However, the languages are somewhat different, so some
modifications have to occur.  This section briefly covers the
essential aspects of this wrapping.
</p>

<H3><a name="Go_package">25.4.1 Go Package Name</a></H3>


<p>
All Go source code lives in a package.  The name of this package will
default to the name of the module from SWIG's <tt>%module</tt>
directive.  You may override this by using SWIG's <tt>-package</tt>
command line option.
</p>

<H3><a name="Go_names">25.4.2 Go Names</a></H3>


<p>
In Go, a function is only visible outside the current package if the
first letter of the name is uppercase.  This is quite different from
C/C++.  Because of this, C/C++ names are modified when generating the
Go interface: the first letter is forced to be uppercase if it is not
already.  This affects the names of functions, methods, variables,
constants, enums, and classes.
</p>

<p>
C/C++ variables are wrapped with setter and getter functions in Go.
First the first letter of the variable name will be forced to
uppercase, and then <tt>Get</tt> or <tt>Set</tt> will be prepended.
For example, if the C/C++ variable is called <tt>var</tt>, then SWIG
will define the functions <tt>GetVar</tt> and <tt>SetVar</tt>.  If a
variable is declared as <tt>const</tt>, or if
SWIG's <a href="SWIG.html#SWIG_readonly_variables">
<tt>%immutable</tt> directive</a> is used for the variable, then only
the getter will be defined.
</p>

<p>
C++ classes will be discussed further below.  Here we'll note that the
first letter of the class name will be forced to uppercase to give the
name of a type in Go.  A constructor will be named <tt>New</tt>
followed by that name, and the destructor will be
named <tt>Delete</tt> followed by that name.
</p>

<H3><a name="Go_constants">25.4.3 Go Constants</a></H3>


<p>
C/C++ constants created via <tt>#define</tt> or the <tt>%constant</tt>
directive become Go constants, declared with a <tt>const</tt>
declaration.

<H3><a name="Go_enumerations">25.4.4 Go Enumerations</a></H3>


<p>
C/C++ enumeration types will cause SWIG to define an integer type with
the name of the enumeration (with first letter forced to uppercase as
usual).  The values of the enumeration will become variables in Go;
code should avoid modifying those variables.
</p>

<H3><a name="Go_classes">25.4.5 Go Classes</a></H3>


<p>
Go has interfaces, methods and inheritance, but it does not have
classes in the same sense as C++.  This sections describes how SWIG
represents C++ classes represented in Go.
</p>

<p>
For a C++ class <tt>ClassName</tt>, SWIG will define two types in Go:
an underlying type, which will just hold a pointer to the C++ type,
and an interface type.  The interface type will be
named <tt>ClassName</tt>.  SWIG will define a
function <tt>NewClassName</tt> which will take any constructor
arguments and return a value of the interface
type <tt>ClassName</tt>.  SWIG will also define a
destructor <tt>DeleteClassName</tt>.
</p>

<p>
SWIG will represent any methods of the C++ class as methods on the
underlying type, and also as methods of the interface type.  Thus C++
methods may be invoked directly using the
usual <tt>val.MethodName</tt> syntax.  Public members of the C++ class
will be given getter and setter functions defined as methods of the
class.
</p>

<p>
SWIG will represent static methods of C++ classes as ordinary Go
functions.  SWIG will use names like <tt>ClassNameMethodName</tt>.
SWIG will give static members getter and setter functions with names
like <tt>GetClassName_VarName</tt>.
</p>

<p>
Given a value of the interface type, Go code can retrieve the pointer
to the C++ type by calling the <tt>Swigcptr</tt> method.  This will
return a value of type <tt>SwigcptrClassName</tt>, which is just a
name for <tt>uintptr</tt>.  A Go type conversion can be used to
convert this value to a different C++ type, but note that this
conversion will not be type checked and is essentially equivalent
to <tt>reinterpret_cast</tt>.  This should only be used for very
special cases, such as where C++ would use a <tt>dynamic_cast</tt>.
</p>

<p>Note that C++ pointers to compound objects are represented in go as objects
themselves, not as go pointers.  So, for example, if you wrap the following
function:</p>
<div class="code">
<pre>
class MyClass {
  int MyMethod();
  static MyClass *MyFactoryFunction();
};

</pre>
</div>
<p>You will get go code that looks like this:</p>
<div class="code">
<pre>
type MyClass interface {
  Swigcptr() uintptr
  SwigIsMyClass()
  MyMethod() int
}

func MyClassMyFactoryFunction() MyClass {
  // swig magic here
}
</pre>
</div>
<p>Note that the factory function does not return a go pointer; it actually
returns a go interface.  If the returned pointer can be null, you can check
for this by calling the Swigcptr() method.
</p>

<H4><a name="Go_class_memory">25.4.5.1 Go Class Memory Management</a></H4>


<p>
Calling <tt>NewClassName</tt> for a C++ class <tt>ClassName</tt> will allocate
memory using the C++ memory allocator.  This memory will not be automatically
freed by Go's garbage collector as the object ownership is not tracked.  When
you are done with the C++ object you must free it using
<tt>DeleteClassName</tt>.<br>
<br>
The most Go idiomatic way to manage the memory for some C++ class is to call
<tt>NewClassName</tt> followed by a
<tt><a href="https://golang.org/doc/effective_go.html#defer">defer</a></tt> of
the <tt>DeleteClassName</tt> call.  Using <tt>defer</tt> ensures that the memory
of the C++ object is freed as soon as the function containing the <tt>defer</tt>
statement returns.  Furthermore <tt>defer</tt> works great for short-lived
objects and fits nicely C++'s RAII idiom.  Example:
</p>
<div class="code">
<pre>
func UseClassName(...) ... {
  o := NewClassName(...)
  defer DeleteClassName(o)
  // Use the ClassName object
  return ...
}
</pre>
</div>

<p>
With increasing complexity, especially complex C++ object hierarchies, the
correct placement of <tt>defer</tt> statements becomes harder and harder as C++
objects need to be freed in the correct order.  This problem can be eased by
keeping a C++ object function local so that it is only available to the function
that creates a C++ object and functions called by this function.  Example:
</p>
<div class="code">
<pre>
func WithClassName(constructor args, f func(ClassName, ...interface{}) error, data ...interface{}) error {
  o := NewClassName(constructor args)
  defer DeleteClassName(o)
  return f(o, data...)
}

func UseClassName(o ClassName, data ...interface{}) (err error) {
  // Use the ClassName object and additional data and return error.
}

func main() {
  WithClassName(constructor args, UseClassName, additional data)
}
</pre>
</div>

<p>
Using <tt>defer</tt> has limitations though, especially when it comes to
long-lived C++ objects whose lifetimes are hard to predict.  For such C++
objects a common technique is to store the C++ object into a Go object, and to
use the Go function <tt>runtime.SetFinalizer</tt> to add a finalizer which frees
the C++ object when the Go object is freed.  It is strongly recommended  to read
the <a href="https://golang.org/pkg/runtime/#SetFinalizer">runtime.SetFinalizer
</a> documentation before using this technique to understand the
<tt>runtime.SetFinalizer</tt> limitations.<br>
</p>
<p>
Common pitfalls with <tt>runtime.SetFinalizer</tt> are:
</p>
<ul>
<li>
If a hierarchy of C++ objects will be automatically freed by Go finalizers then
the Go objects that store the C++ objects need to replicate the hierarchy of the
C++ objects to prevent that C++ objects are freed prematurely while other C++
objects still rely on them.
</li>
<li>
The usage of Go finalizers is problematic with C++'s RAII idiom as it isn't
predictable when the finalizer will run and this might require a Close or Delete
method to be added the Go object that stores a C++ object to mitigate.
</li>
<li>
The Go finalizer function typically runs in a different OS thread which can be
problematic with C++ code that uses thread-local storage.
</li>
</ul>

<p>
<tt>runtime.SetFinalizer</tt> Example:
</p>
<div class="code">
<pre>
import (
  "runtime"
  "wrap" // SWIG generated wrapper code
)

type GoClassName struct {
  wcn wrap.ClassName
}

func NewGoClassName() *GoClassName {
  o := &amp;GoClassName{wcn: wrap.NewClassName()}
  runtime.SetFinalizer(o, deleteGoClassName)
  return o
}

func deleteGoClassName(o *GoClassName) {
  // Runs typically in a different OS thread!
  wrap.DeleteClassName(o.wcn)
  o.wcn = nil
}

func (o *GoClassName) Close() {
  // If the C++ object has a Close method.
  o.wcn.Close()

  // If the GoClassName object is no longer in an usable state.
  runtime.SetFinalizer(o, nil) // Remove finalizer.
  deleteGoClassName() // Free the C++ object.
}
</pre>
</div>

<H4><a name="Go_class_inheritance">25.4.5.2 Go Class Inheritance</a></H4>


<p>
C++ class inheritance is automatically represented in Go due to its
use of interfaces.  The interface for a child class will be a superset
of the interface of its parent class.  Thus a value of the child class
type in Go may be passed to a function which expects the parent class.
Doing the reverse will require an explicit type assertion, which will
be checked dynamically.
</p>

<H3><a name="Go_templates">25.4.6 Go Templates</a></H3>


<p>
In order to use C++ templates in Go, you must tell SWIG to create
wrappers for a particular template instantation.  To do this, use
the <tt>%template</tt> directive.


<H3><a name="Go_director_classes">25.4.7 Go Director Classes</a></H3>


<p>
SWIG's director feature permits a Go type to act as the subclass of a C++ class.
This is complicated by the fact that C++ and Go define inheritance differently.
SWIG normally represents the C++ class inheritance automatically in Go via
interfaces but with a Go type representing a subclass of a C++ class some manual
work is necessary.
</p>

<p>
This subchapter gives a step by step guide how to properly subclass a C++ class
with a Go type.  In general it is strongly recommended to follow this guide
completely to avoid common pitfalls with directors in Go.
</p>


<H4><a name="Go_director_example_cpp_code">25.4.7.1 Example C++ code</a></H4>


<p>
The step by step guide is based on two example C++ classes.  FooBarAbstract is
an abstract C++ class and the FooBarCpp class inherits from it.  This guide
explains how to implement a FooBarGo class similar to the FooBarCpp class.
</p>

<p>
<tt>FooBarAbstract</tt> abstract C++ class:
</p>

<div class="code">
<pre>
class FooBarAbstract
{
public:
  FooBarAbstract() {};
  virtual ~FooBarAbstract() {};

  std::string FooBar() {
    return this-&gt;Foo() + ", " + this-&gt;Bar();
  };

protected:
  virtual std::string Foo() {
    return "Foo";
  };

  virtual std::string Bar() = 0;
};
</pre>
</div>

<p>
<tt>FooBarCpp</tt> C++ class:
</p>

<div class="code">
<pre>
class FooBarCpp : public FooBarAbstract
{
protected:
  virtual std::string Foo() {
    return "C++ " + FooBarAbstract::Foo();
  }

  virtual std::string Bar() {
    return "C++ Bar";
  }
};
</pre>
</div>

<p>
Returned string by the <tt>FooBarCpp::FooBar</tt> method is:
</p>

<div class="code">
<pre>
C++ Foo, C++ Bar
</pre>
</div>


<p>
The complete example, including the <tt>FooBarGoo</tt> class implementation, can
be found in <a href="#Go_director_foobargo_class">the end of the guide</a>.
</p>


<H4><a name="Go_director_enable">25.4.7.2 Enable director feature</a></H4>


<p>
The director feature is disabled by default. To use directors you must make two
changes to the interface file. First, add the "directors" option to the %module
directive, like this:
</p>

<div class="code">
<pre>
%module(directors="1") modulename
</pre>
</div>

<p>
Second, you must use the %feature("director") directive to tell SWIG which
classes should get directors.  In the example the FooBarAbstract class needs the
director feature enabled so that the FooBarGo class can inherit from it, like
this:
</p>

<div class="code">
<pre>
%feature("director") FooBarAbstract;
</pre>
</div>

<p>
For a more detailed documentation of the director feature and how to enable or
disable it for specific classes and virtual methods see SWIG's Java
documentation on directors.
</p>


<H4><a name="Go_director_ctor_dtor">25.4.7.3 Constructor and destructor</a></H4>


<p>
SWIG creates an additional set of constructor and destructor functions once the
director feature has been enabled for a C++ class.
<tt>NewDirectorClassName</tt> allows overriding virtual methods on the new
object instance and <tt>DeleteDirectorClassName</tt> needs to be used to free a
director object instance created with <tt>NewDirectorClassName</tt>.
More on overriding virtual methods follows later in this guide under
<a href="#Go_director_overriding">overriding virtual methods</a>.
</p>

<p>
The default constructor and destructor functions <tt>NewClassName</tt> and
<tt>DeleteClassName</tt> can still be used as before so that existing code
doesn't break just because the director feature has been enabled for a C++
class.  The behavior is undefined if the default and director constructor and
destructor functions get mixed and so great care needs to be taken that only one
of the constructor and destructor function pairs is used for any object
instance.  Both constructor functions, the default and the director one, return
the same interface type.  This makes it potentially hard to know which
destructor function, the default or the director one, needs to be called to
delete an object instance.
</p>

<p>
In <b>theory</b> the <tt>DirectorInterface</tt> method could be used to
determine if an object instance was created via <tt>NewDirectorClassName</tt>:
</p>

<div class="code">
<pre>
if o.DirectorInterface() != nil {
  DeleteDirectorClassName(o)
} else {
  DeleteClassName(o)
}
</pre>
</div>

<p>
In <b>practice</b> it is strongly recommended to embed a director object
instance in a Go struct so that a director object instance will be represented
as a distinct Go type that subclasses a C++ class.  For this Go type custom
constructor and destructor functions take care of the director constructor and
destructor function calls and the resulting Go class will appear to the user as
any other SWIG wrapped C++ class.  More on properly subclassing a C++ class
follows later in this guide under <a href="#Go_director_subclass">subclass via
embedding</a>.
</p>


<H4><a name="Go_director_overriding">25.4.7.4 Override virtual methods</a></H4>


<p>
In order to override virtual methods on a C++ class with Go methods the
<tt>NewDirectorClassName</tt> constructor functions receives a
<tt>DirectorInterface</tt> argument.  The methods in the <tt>
DirectorInterface</tt> are a subset of the public and protected virtual methods
of the C++ class.  If the <tt>DirectorInterface</tt> contains a method with a
matching signature to a virtual method of the C++ class then the virtual C++
method will be overwritten with the Go method.  As Go doesn't support protected
methods all overridden protected virtual C++ methods will be public in Go.
</p>

<p>
As an example see part of the <tt>FooBarGo</tt> class:
</p>

<div class="code">
<pre>
type overwrittenMethodsOnFooBarAbstract struct {
  fb FooBarAbstract
}

func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
  ...
}

func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
  ...
}

func NewFooBarGo() FooBarGo {
  om := &amp;overwrittenMethodsOnFooBarAbstract{}
  fb := NewDirectorFooBarAbstract(om)
  om.fb = fb
  ...
}
</pre>
</div>

<p>
The complete example, including the <tt>FooBarGoo</tt> class implementation, can
be found in <a href="#Go_director_foobargo_class">the end of the guide</a>.  In
this part of the example the virtual methods <tt>FooBarAbstract::Foo</tt> and
<tt>FooBarAbstract::Bar</tt> have been overwritten with Go methods similarly to
how the <tt>FooBarAbstract</tt> virtual methods are overwritten by the
<tt>FooBarCpp</tt> class.
</p>

<p>
The <tt>DirectorInterface</tt> in the example is implemented by the
<tt>overwrittenMethodsOnFooBarAbstract</tt> Go struct type.  A pointer to a
<tt>overwrittenMethodsOnFooBarAbstract</tt> struct instance will be given to the
<tt>NewDirectorFooBarAbstract</tt> constructor function.  The constructor return
value implements the <tt>FooBarAbstract</tt> interface.
<tt>overwrittenMethodsOnFooBarAbstract</tt> could in theory be any Go type but
in practice a struct is used as it typically contains at least a value of the
C++ class interface so that the overwritten methods can use the rest of the
C++ class.  If the <tt>FooBarGo</tt> class would receive additional constructor
arguments then these would also typically be stored in the
<tt>overwrittenMethodsOnFooBarAbstract</tt> struct so that they can be used by
the Go methods.
</p>


<H4><a name="Go_director_base_methods">25.4.7.5 Call base methods</a></H4>


<p>
Often a virtual method will be overwritten to extend the original behavior of
the method in the base class.  This is also the case for the
<tt>FooBarCpp::Foo</tt> method of the example code:
</p>

<div class="code">
<pre>
virtual std::string Foo() {
  return "C++ " + FooBarAbstract::Foo();
}
</pre>
</div>

<p>
To use base methods the <tt>DirectorClassNameMethodName</tt> wrapper functions
are automatically generated by SWIG for public and protected virtual methods.
The <tt>FooBarGo.Foo</tt> implementation in the example looks like this:
</p>

<div class="code">
<pre>
func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
  return "Go " + DirectorFooBarAbstractFoo(om.fb)
}
</pre>
</div>

<p>
The complete example, including the <tt>FooBarGoo</tt> class implementation, can
be found in <a href="#Go_director_foobargo_class">the end of the guide</a>.
</p>


<H4><a name="Go_director_subclass">25.4.7.6 Subclass via embedding</a></H4>


<p>
<a href="#Go_director_ctor_dtor">As previously mentioned in this guide</a> the
default and director constructor functions return the same interface type.  To
properly subclass a C++ class with a Go type the director object instance
returned by the <tt>NewDirectorClassName</tt> constructor function should be
embedded into a Go struct so that it represents a distinct but compatible type
in Go's type system.  This Go struct should be private and the constructor and
destructor functions should instead work with a public interface type so that
the Go class that subclasses a C++ class can be used as a compatible drop in.
</p>

<p>
The subclassing part of the <tt>FooBarGo</tt> class for an example looks like
this:
</p>

<div class="code">
<pre>
type FooBarGo interface {
  FooBarAbstract
  deleteFooBarAbstract()
  IsFooBarGo()
}

type fooBarGo struct {
  FooBarAbstract
}

func (fbgs *fooBarGo) deleteFooBarAbstract() {
  DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
}

func (fbgs *fooBarGo) IsFooBarGo() {}

func NewFooBarGo() FooBarGo {
  om := &amp;overwrittenMethodsOnFooBarAbstract{}
  fb := NewDirectorFooBarAbstract(om)
  om.fb = fb

  return &amp;fooBarGo{FooBarAbstract: fb}
}

func DeleteFooBarGo(fbg FooBarGo) {
  fbg.deleteFooBarAbstract()
}
</pre>
</div>


<p>
The complete example, including the <tt>FooBarGoo</tt> class implementation, can
be found in <a href="#Go_director_foobargo_class">the end of the guide</a>.  In
this part of the example the private <tt>fooBarGo</tt> struct embeds <tt>
FooBarAbstract</tt> which lets the <tt>fooBarGo</tt> Go type "inherit" all the
methods of the <tt>FooBarAbstract</tt> C++ class by means of embedding.  The
public <tt>FooBarGo</tt> interface type includes the <tt>FooBarAbstract</tt>
interface and hence <tt>FooBarGo</tt> can be used as a drop in replacement for
<tt>FooBarAbstract</tt> while the reverse isn't possible and would raise a
compile time error.  Furthermore the constructor and destructor functions <tt>
NewFooBarGo</tt> and <tt>DeleteFooBarGo</tt> take care of all the director
specifics and to the user the class appears as any other SWIG wrapped C++
class.
</p>


<H4><a name="Go_director_finalizer">25.4.7.7 Memory management with runtime.SetFinalizer</a></H4>


<p>
In general all guidelines for <a href="#Go_class_memory">C++ class memory
management</a> apply as well to director classes.  One often overlooked
limitation with <tt>runtime.SetFinalizer</tt> is that a finalizer doesn't run
in case of a cycle and director classes typically have a cycle.  The cycle
in the <tt>FooBarGo</tt> class is here:
</p>

<div class="code">
<pre>
type overwrittenMethodsOnFooBarAbstract struct {
  fb FooBarAbstract
}

func NewFooBarGo() FooBarGo {
  om := &amp;overwrittenMethodsOnFooBarAbstract{}
  fb := NewDirectorFooBarAbstract(om) // fb.v = om
  om.fb = fb // Backlink causes cycle as fb.v = om!
  ...
}
</pre>
</div>

<p>
In order to be able to use <tt>runtime.SetFinalizer</tt> nevertheless the
finalizer needs to be set on something that isn't in a cycle and that references
the director object instance.  In the <tt>FooBarGo</tt> class example the <tt>
FooBarAbstract</tt> director instance can be automatically deleted by setting
the finalizer on <tt>fooBarGo</tt>:
</p>

<div class="code">
<pre>
type fooBarGo struct {
  FooBarAbstract
}

type overwrittenMethodsOnFooBarAbstract struct {
  fb FooBarAbstract
}

func NewFooBarGo() FooBarGo {
  om := &amp;overwrittenMethodsOnFooBarAbstract{}
  fb := NewDirectorFooBarAbstract(om)
  om.fb = fb // Backlink causes cycle as fb.v = om!

  fbgs := &amp;fooBarGo{FooBarAbstract: fb}
  runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
  return fbgs
}
</pre>
</div>

<p>
Furthermore if <tt>runtime.SetFinalizer</tt> is in use either the <tt>
DeleteClassName</tt> destructor function needs to be removed or the <tt>
fooBarGo</tt> struct needs additional data to prevent double deletion.  Please
read the <a href="#Go_class_memory">C++ class memory management</a> subchapter
before using <tt>runtime.SetFinalizer</tt> to know all of its gotchas.
</p>


<H4><a name="Go_director_foobargo_class">25.4.7.8 Complete FooBarGo example class</a></H4>


<p>
The complete and annotated <tt>FooBarGo</tt> class looks like this:
</p>

<div class="code">
<pre>
// FooBarGo is a superset of FooBarAbstract and hence FooBarGo can be used as a
// drop in replacement for FooBarAbstract but the reverse causes a compile time
// error.
type FooBarGo interface {
  FooBarAbstract
  deleteFooBarAbstract()
  IsFooBarGo()
}

// Via embedding fooBarGo "inherits" all methods of FooBarAbstract.
type fooBarGo struct {
  FooBarAbstract
}

func (fbgs *fooBarGo) deleteFooBarAbstract() {
  DeleteDirectorFooBarAbstract(fbgs.FooBarAbstract)
}

// The IsFooBarGo method ensures that FooBarGo is a superset of FooBarAbstract.
// This is also how the class hierarchy gets represented by the SWIG generated
// wrapper code.  For an instance FooBarCpp has the IsFooBarAbstract and
// IsFooBarCpp methods.
func (fbgs *fooBarGo) IsFooBarGo() {}

// Go type that defines the DirectorInterface. It contains the Foo and Bar
// methods that overwrite the respective virtual C++ methods on FooBarAbstract.
type overwrittenMethodsOnFooBarAbstract struct {
  // Backlink to FooBarAbstract so that the rest of the class can be used by
  // the overridden methods.
  fb FooBarAbstract

  // If additional constructor arguments have been given they are typically
  // stored here so that the overridden methods can use them.
}

func (om *overwrittenMethodsOnFooBarAbstract) Foo() string {
  // DirectorFooBarAbstractFoo calls the base method FooBarAbstract::Foo.
  return "Go " + DirectorFooBarAbstractFoo(om.fb)
}

func (om *overwrittenMethodsOnFooBarAbstract) Bar() string {
  return "Go Bar"
}

func NewFooBarGo() FooBarGo {
  // Instantiate FooBarAbstract with selected methods overridden.  The methods
  // that will be overwritten are defined on
  // overwrittenMethodsOnFooBarAbstract and have a compatible signature to the
  // respective virtual C++ methods. Furthermore additional constructor
  // arguments will be typically stored in the
  // overwrittenMethodsOnFooBarAbstract struct.
  om := &amp;overwrittenMethodsOnFooBarAbstract{}
  fb := NewDirectorFooBarAbstract(om)
  om.fb = fb // Backlink causes cycle as fb.v = om!

  fbgs := &amp;fooBarGo{FooBarAbstract: fb}
  // The memory of the FooBarAbstract director object instance can be
  // automatically freed once the FooBarGo instance is garbage collected by
  // uncommenting the following line.  Please make sure to understand the
  // runtime.SetFinalizer specific gotchas before doing this.  Furthermore
  // DeleteFooBarGo should be deleted if a finalizer is in use or the fooBarGo
  // struct needs additional data to prevent double deletion.
  // runtime.SetFinalizer(fbgs, FooBarGo.deleteFooBarAbstract)
  return fbgs
}

// Recommended to be removed if runtime.SetFinalizer is in use.
func DeleteFooBarGo(fbg FooBarGo) {
  fbg.deleteFooBarAbstract()
}
</pre>
</div>

<p>
Returned string by the <tt>FooBarGo.FooBar</tt> method is:
</p>

<div class="code">
<pre>
Go Foo, Go Bar
</pre>
</div>

<p>
For comparison the <tt>FooBarCpp</tt> class looks like this:
</p>

<div class="code">
<pre>
class FooBarCpp : public FooBarAbstract
{
protected:
  virtual std::string Foo() {
    return "C++ " + FooBarAbstract::Foo();
  }

  virtual std::string Bar() {
    return "C++ Bar";
  }
};
</pre>
</div>

<p>
For comparison the returned string by the <tt>FooBarCpp::FooBar</tt> method is:
</p>

<div class="code">
<pre>
C++ Foo, C++ Bar
</pre>
</div>

<p>
The complete source of this example can be found under
<a href="https://github.com/swig/swig/tree/master/Examples/go/director">
SWIG/Examples/go/director/</a>.
</p>


<H3><a name="Go_primitive_type_mappings">25.4.8 Default Go primitive type mappings</a></H3>


<p>
The following table lists the default type mapping from C/C++ to Go.
This table will tell you which Go type to expect for a function which
uses a given C/C++ type.
</p>

<table BORDER summary="Go primitive type mappings">
<tr>
<td><b>C/C++ type</b></td>
<td><b>Go type</b></td>
</tr>

<tr>
<td>bool</td>
<td>bool</td>
</tr>

<tr>
<td>char</td>
<td>byte</td>
</tr>

<tr>
<td>signed char</td>
<td>int8</td>
</tr>

<tr>
<td>unsigned char</td>
<td>byte</td>
</tr>

<tr>
<td>short</td>
<td>int16</td>
</tr>

<tr>
<td>unsigned short</td>
<td>uint16</td>
</tr>

<tr>
<td>int</td>
<td>int</td>
</tr>

<tr>
<td>unsigned int</td>
<td>uint</td>
</tr>

<tr>
<td>long</td>
<td>int64</td>
</tr>

<tr>
<td>unsigned long</td>
<td>uint64</td>
</tr>

<tr>
<td>long long</td>
<td>int64</td>
</tr>

<tr>
<td>unsigned long long</td>
<td>uint64</td>
</tr>

<tr>
<td>float</td>
<td>float32</td>
</tr>

<tr>
<td>double</td>
<td>float64</td>
</tr>

<tr>
<td>char *<br>char []</td>
<td>string</td>
</tr>

</table>

<p>
Note that SWIG wraps the C <tt>char</tt> type as a character. Pointers
and arrays of this type are wrapped as strings.  The <tt>signed
char</tt> type can be used if you want to treat <tt>char</tt> as a
signed number rather than a character.  Also note that all const
references to primitive types are treated as if they are passed by
value.
</p>

<p>
These type mappings are defined by the "gotype" typemap.  You may change
that typemap, or add new values, to control how C/C++ types are mapped
into Go types.
</p>

<H3><a name="Go_output_arguments">25.4.9 Output arguments</a></H3>


<p>Because of limitations in the way output arguments are processed in swig,
a function with output arguments will not have multiple return values.
Instead, you must pass a pointer into the C++ function to tell it where to
store the output value.  In go, you supply a slice in the place of the output
argument.</p>

<p>For example, suppose you were trying to wrap the modf() function in the
C math library which splits x into integral and fractional parts (and
returns the integer part in one of its parameters):</p>
<div class="code">
<pre>
double modf(double x, double *ip);
</pre>
</div>
<p>You could wrap it with SWIG as follows:</p>
<div class="code">
<pre>
%include &lt;typemaps.i&gt;
double modf(double x, double *OUTPUT);
</pre>
</div>
<p>or you can use the <code>%apply</code> directive:</p>
<div class="code">
<pre>
%include &lt;typemaps.i&gt;
%apply double *OUTPUT { double *ip };
double modf(double x, double *ip);
</pre>
</div>
<p>In Go you would use it like this:</p>
<div class="code">
<pre>
ptr := []float64{0.0}
fraction := modulename.Modf(5.0, ptr)
</pre>
</div>
<p>Since this is ugly, you may want to wrap the swig-generated API with
some <a href="#Embedded_go_code">additional functions written in go</a> that
hide the ugly details.</p>

<p>There are no <code>char&nbsp;*OUTPUT</code> typemaps.  However you can
apply the <code>signed&nbsp;char&nbsp;*</code> typemaps instead:</p>
<div class="code">
<pre>
%include &lt;typemaps.i&gt;
%apply signed char *OUTPUT {char *output};
void f(char *output);
</pre>
</div>

<H3><a name="Go_adding_additional_code">25.4.10 Adding additional go code</a></H3>


<p>Often the APIs generated by swig are not very natural in go, especially if
there are output arguments.  You can
insert additional go wrapping code to add new APIs
with <code>%insert(go_wrapper)</code>, like this:</p>
<div class="code">
<pre>
%include &lt;typemaps.i&gt;
// Change name of what swig generates to Wrapped_modf.  This function will
// have the following signature in go:
//   func Wrapped_modf(float64, []float64) float64
%rename(wrapped_modf) modf(double x, double *ip);

%apply double *OUTPUT { double *ip };
double modf(double x, double *ip);

%insert(go_wrapper) %{

// The improved go interface to this function, which has two return values,
// in the more natural go idiom:
func Modf(x float64) (fracPart float64, intPart float64) {
  ip := []float64{0.0}
  fracPart = Wrapped_modf(x, ip)
  intPart = ip[0]
  return
}

%}
</pre>
</div>

<p>For classes, since swig generates an interface, you can add additional
methods by defining another interface that includes the swig-generated
interface.  For example,</p>
<div class="code">
<pre>
%rename(Wrapped_MyClass) MyClass;
%rename(Wrapped_GetAValue) MyClass::GetAValue(int *x);
%apply int *OUTPUT { int *x };

class MyClass {
 public:
  MyClass();
  int AFineMethod(const char *arg); // Swig's wrapping is fine for this one.
  bool GetAValue(int *x);
};

%insert(go_wrapper) %{

type MyClass interface {
  Wrapped_MyClass
  GetAValue() (int, bool)
}

func (arg SwigcptrWrapped_MyClass) GetAValue() (int, bool) {
  ip := []int{0}
  ok := arg.Wrapped_GetAValue(ip)
  return ip[0], ok
}

%}
</pre>
</div>
<p>Of course, if you have to rewrite most of the methods, instead of just a
few, then you might as well define your own struct that includes the
swig-wrapped object, instead of adding methods to the swig-generated object.</p>

<p>If you need to import other go packages, you can do this with
<code>%go_import</code>.  For example,</p>
<div class="code">
<pre>
%go_import("fmt", _ "unusedPackage", rp "renamed/package")

%insert(go_wrapper) %{

func foo() {
  fmt.Println("Some string:", rp.GetString())
}

// Importing the same package twice is permitted,
// Go code will be generated with only the first instance of the import.
%go_import("fmt")

%insert(go_wrapper) %{

func bar() {
  fmt.Println("Hello world!")
}

%}
</pre>
</div>

<H3><a name="Go_typemaps">25.4.11 Go typemaps</a></H3>


<p>
You can use the <tt>%typemap</tt> directive to modify SWIG's default
wrapping behavior for specific C/C++ types.  You need to be familiar
with the material in the general
"<a href="Typemaps.html#Typemaps">Typemaps</a>" chapter.  That chapter
explains how to define a typemap.  This section describes some
specific typemaps used for Go.
</p>

<p>
In general type conversion code may be written either in C/C++ or in
Go.  The choice to make normally depends on where memory should be
allocated.  To allocate memory controlled by the Go garbage collector,
write Go code.  To allocate memory in the C/C++ heap, write C code.
</p>

<table BORDER summary="Go Typemaps">
<tr>
<td><b>Typemap</b></td>
<td><b>Description</b></td>
</tr>

<tr>
<td>gotype</td>
<td>
The Go type to use for a C++ type.  This type will appear in the
generated Go wrapper function.  If this is not defined SWIG will use a
default as <a href="#Go_primitive_type_mappings">described above</a>.
</td>
</tr>

<tr>
<td>imtype</td>
<td>
An intermediate Go type used by the "goin", "goout", "godirectorin",
and "godirectorout" typemaps.  If this typemap is not defined for a
C/C++ type, the gotype typemape will be used.  This is useful when
gotype is best converted to C/C++ using Go code.
</td>
</tr>

<tr>
<td>goin</td>
<td>
Go code to convert from gotype to imtype when calling a C/C++
function.  SWIG will then internally convert imtype to a C/C++ type
and pass it down.  If this is not defined, or is the empty string, no
conversion is done.
</td>
</tr>

<tr>
<td>in</td>
<td>
C/C++ code to convert the internally generated C/C++ type, based on
imtype, into the C/C++ type that a function call expects.  If this is
not defined the value will simply be cast to the desired type.
</td>
</tr>

<tr>
<td>out</td>
<td>
C/C++ code to convert the C/C++ type that a function call returns into
the internally generated C/C++ type, based on imtype, that will be
returned to Go.  If this is not defined the value will simply be cast
to the desired type.
</td>
</tr>

<tr>
<td>goout</td>
<td>
Go code to convert a value returned from a C/C++ function from imtype
to gotype.  If this is not defined, or is the empty string, no
conversion is done.
</td>
</tr>

<tr>
<td>argout</td>
<td>
C/C++ code to adjust an argument value when returning from a function.
This is called after the real C/C++ function has run.  This uses the
internally generated C/C++ type, based on imtype.  This is only useful
for a pointer type of some sort.  If this is not defined nothing will
be done.
</td>
</tr>

<tr>
<td>goargout</td>
<td>
Go code to adjust an argument value when returning from a function.
This is called after the real C/C++ function has run.  The value will
be in imtype.  This is only useful for a pointer type of some sort.
If this is not defined, or is the empty string, nothing will be done.
</td>
</tr>

<tr>
<td>directorin</td>
<td>
C/C++ code to convert the C/C++ type used to call a director method
into the internally generated C/C++ type, based on imtype, that will
be passed to Go.  If this is not defined the value will simply be cast
to the desired type.
</td>
</tr>

<tr>
<td>godirectorin</td>
<td>
Go code to convert a value used to call a director method from imtype
to gotype.  If this is not defined, or is the empty string, no
conversion is done.
</td>
</tr>

<tr>
<td>godirectorout</td>
<td>
Go code to convert a value returned from a director method from gotype
to imtype.  If this is not defined, or is the empty string, no
conversion is done.
</td>
</tr>

<tr>
<td>directorout</td>
<td>
C/C++ code to convert a value returned from a director method from the
internally generated C/C++ type, based on imtype, into the type that
the method should return  If this is not defined the value will simply
be cast to the desired type.
</td>
</tr>

</table>

</body>
</html>
