The Lookup method is returning a pointer to the symbol (That way the program can modify the value of Impl through the plugin.)
I believe you can write: printerImpl := *p.(*printer.Printer) On Thu, Nov 3, 2016 at 9:44 AM, Ian Lance Taylor <i...@golang.org> wrote: > [ +crawshaw ] > > On Thu, Nov 3, 2016 at 12:51 AM, Mateusz Dymiński <dymin...@gmail.com> wrote: >> Hi, >> >> I am trying to load dynamically implementation of particular interface. I've >> created the example in following repo: >> https://github.com/mateuszdyminski/go-plugin >> >> I have interface - let's call it Printer: >> package printer >> >> type Printer interface { >> Print(text string) >> } >> >> >> And implementation of this interface: >> package main >> >> import ( >> "fmt" >> >> "github.com/mateuszdyminski/go-plugin/printer" >> ) >> >> func main() { >> Impl.Print("test") >> } >> >> type PrinterImpl struct{} >> >> func (p PrinterImpl) Print(text string) { >> fmt.Printf("[PrinterImpl] %s\n", text) >> } >> >> var Impl printer.Printer = PrinterImpl{} >> >> >> Then I can build that implementation of Printer as following: >> go build -buildmode=plugin printer.go >> >> >> The last step is to load dynamically created library 'printer.so': >> package main >> >> import ( >> "fmt" >> "plugin" >> "reflect" >> >> "github.com/mateuszdyminski/go-plugin/printer" >> ) >> >> func main() { >> lib, err := plugin.Open("printer.so") >> if err != nil { >> panic(err) >> } >> >> p, err := lib.Lookup("Impl") >> if err != nil { >> panic(err) >> } >> >> printerImpl, ok := p.(printer.Printer) >> if !ok { >> fmt.Printf("wrong type: %+v \n", reflect.TypeOf(p)) >> panic("wrong type") >> } >> >> printerImpl.Print("test") >> } >> >> >> But when I run it with 'go run main.go' I got following error: >> wrong type: *printer.Printer >> panic: wrong type >> >> goroutine 1 [running]: >> panic(0x50fda0, 0xc42000c2d0) >> /home/md/.gvm/gos/master/src/runtime/panic.go:531 +0x1cf >> main.main() >> /home/md/workspace/go/src/github.com/mateuszdyminski/go-plugin/main.go:25 >> +0x231 >> exit status 2 >> >> >> The type of the 'Impl' taken from 'reflect' package is '*printer.Printer'. >> Is it possible to cast it to the printer.Printer and not to the pointer to >> the interface? >> >> Thanks for any help! >> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts+unsubscr...@googlegroups.com. >> For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.