Ahhhh, thanks a lot for your help and sorry for trivial question.
To test the type assertion I should use following code: printerImpl, ok := p.(*printer.Printer) if !ok { panic("wrong type") } (*printerImpl).Print("test") I was trying to call the 'Print' func as *printerImpl.Print("test") not (*printerImpl).Print("test"). Thanks again! 2016-11-03 14:51 GMT+01:00 David Crawshaw <craws...@golang.org>: > 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.