This example illustrates how to use directors to implement C++ callbacks in Go.
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 New followed by the capitalized name of the class, you call a function named NewDirector followed by the capitalized name of the class.
The first argument to the NewDirector function is an instance of a type. The NewDirector 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 NewDirector 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.
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:
In other words, we first create the Go value. We pass that to the NewDirector 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.type Child struct { abi Parent } func (p *Child) ChildMethod() { p.abi.ParentMethod() } func f() { p := &Child{nil} d := NewDirectorParent(p) p.abi = d ... }
To delete a director object, use the function DeleteDirector followed by the capitalized name of the class.