|  | <html> | 
|  | <head> | 
|  | <title>SWIG:Examples:go:funcptr</title> | 
|  | </head> | 
|  |  | 
|  | <body bgcolor="#ffffff"> | 
|  |  | 
|  |  | 
|  | <tt>SWIG/Examples/go/funcptr/</tt> | 
|  | <hr> | 
|  |  | 
|  | <H2>Pointers to Functions</H2> | 
|  |  | 
|  | <p> | 
|  | Okay, just what in the heck does SWIG do with a declaration like this? | 
|  |  | 
|  | <blockquote> | 
|  | <pre> | 
|  | int do_op(int a, int b, int (*op)(int, int)); | 
|  | </pre> | 
|  | </blockquote> | 
|  |  | 
|  | Well, it creates a wrapper as usual.  Of course, that does raise some | 
|  | questions about the third argument (the pointer to a function). | 
|  |  | 
|  | <p> | 
|  | In this case, SWIG will wrap the function pointer as it does for all | 
|  | other pointers.  However, in order to actually call this function from | 
|  | a Go program, you will need to pass some kind of C function pointer | 
|  | object.  In C, this is easy, you just supply a function name as an | 
|  | argument like this: | 
|  |  | 
|  | <blockquote> | 
|  | <pre> | 
|  | /* Some callback function */ | 
|  | int add(int a, int b) { | 
|  | return a+b; | 
|  | } | 
|  | ... | 
|  | int r = do_op(x,y,add); | 
|  | </pre> | 
|  | </blockquote> | 
|  |  | 
|  | To make this work with SWIG, you will need to do a little extra work. | 
|  | Specifically, you need to create some function pointer objects using | 
|  | the %constant directive like this: | 
|  |  | 
|  | <blockquote> | 
|  | <pre> | 
|  | %constant(int (*)(int,int)) ADD = add; | 
|  | </pre> | 
|  | </blockquote> | 
|  |  | 
|  | Now, in a Go program, you would do this: | 
|  |  | 
|  | <blockquote> | 
|  | <pre> | 
|  | int r = do_op(x,y, example.ADD) | 
|  | </pre> | 
|  | </blockquote> | 
|  | where <tt>example</tt> is the module name. | 
|  |  | 
|  | <h2>An Example</h2> | 
|  |  | 
|  | Here are some files that illustrate this with a simple example: | 
|  |  | 
|  | <ul> | 
|  | <li><a href="example.c">example.c</a> | 
|  | <li><a href="example.h">example.h</a> | 
|  | <li><a href="example.i">example.i</a> (SWIG interface) | 
|  | <li><a href="runme.go">runme.go</a> (Sample program) | 
|  | </ul> | 
|  |  | 
|  | <h2>Notes</h2> | 
|  |  | 
|  | <ul> | 
|  | <li>The value of a function pointer must correspond to a function | 
|  | written in C or C++.  It is not possible to pass an arbitrary Go | 
|  | function in as a substitute for a C function pointer. | 
|  |  | 
|  | </ul> | 
|  |  | 
|  | <hr> | 
|  | </body> | 
|  | </html> | 
|  |  | 
|  |  | 
|  |  | 
|  |  |