aboutsummaryrefslogtreecommitdiff
path: root/Examples/go/callback/index.html
diff options
context:
space:
mode:
authorMichael Schaller <michael@5challer.de>2015-08-08 19:44:41 +0200
committerMichael Schaller <michael@5challer.de>2015-08-09 14:36:58 +0200
commita941e5b605670a8b4686cec5f0d87562846552e2 (patch)
tree1b33255f68ec4d270b482a8d84f66179fed8d9c1 /Examples/go/callback/index.html
parent19a20c794bea67fb7e3530da362473c05cf87cad (diff)
downloadswig-a941e5b605670a8b4686cec5f0d87562846552e2.tar.gz
[Go] Revert commit 5e88857 to undelete the 'callback' and 'extend' examples.
The 'callback' and 'extend' examples were presumed to be obsoleted by the new 'director' example. The examples are helpful though to have similar examples across target languages and hence the commit @5e88857 which removed these examples got reverted.
Diffstat (limited to 'Examples/go/callback/index.html')
-rw-r--r--Examples/go/callback/index.html81
1 files changed, 81 insertions, 0 deletions
diff --git a/Examples/go/callback/index.html b/Examples/go/callback/index.html
new file mode 100644
index 000000000..b053cf547
--- /dev/null
+++ b/Examples/go/callback/index.html
@@ -0,0 +1,81 @@
+<html>
+<head>
+<title>SWIG:Examples:go:callback</title>
+</head>
+
+<body bgcolor="#ffffff">
+
+
+<tt>SWIG/Examples/go/callback/</tt>
+<hr>
+
+<H2>Implementing C++ callbacks in Go</H2>
+
+<p>
+This example illustrates how to use directors to implement C++
+callbacks in Go.
+</p>
+
+<p>
+Because Go and C++ use inheritance differently, you must call a
+different function to create a class which uses callbacks. Instead of
+calling the usual constructor function whose name is <tt>New</tt>
+followed by the capitalized name of the class, you call a function
+named <tt>NewDirector</tt> followed by the capitalized name of the
+class.
+</p>
+
+<p>
+The first argument to the <tt>NewDirector</tt> function is an instance
+of a type. The <tt>NewDirector</tt> function will return an interface
+value as usual. However, when calling any method on the returned
+value, the program will first check whether the value passed
+to <tt>NewDirector</tt> implements that method. If it does, the
+method will be called in Go. This is true whether the method is
+called from Go code or C++ code.
+</p>
+
+<p>
+Note that the Go code will be called with just the Go value, not the
+C++ value. If the Go code needs to call a C++ method on itself, you
+need to get a copy of the C++ object. This is typically done as
+follows:
+
+<blockquote>
+<pre>
+type Child struct { abi Parent }
+func (p *Child) ChildMethod() {
+ p.abi.ParentMethod()
+}
+func f() {
+ p := &Child{nil}
+ d := NewDirectorParent(p)
+ p.abi = d
+ ...
+}
+</pre>
+</blockquote>
+
+In other words, we first create the Go value. We pass that to
+the <tt>NewDirector</tt> function to create the C++ value; this C++
+value will be created with an association to the Go value. We then
+store the C++ value in the Go value, giving us the reverse
+association. That permits us to call parent methods from the child.
+
+</p>
+
+<p>
+To delete a director object, use the function <tt>DeleteDirector</tt>
+followed by the capitalized name of the class.
+</p>
+
+<p>
+<ul>
+<li><a href="example.h">example.h</a>. Header file containing some enums.
+<li><a href="example.i">example.i</a>. Interface file.
+<li><a href="runme.go">runme.go</a>. Sample Go program.
+</ul>
+
+<hr>
+</body>
+</html>