go - Cannot use some type in function call -


currently, i'm having 2 files in 2 packages.

file somepkg/something.go

package somepkg  // ---------------------------------------------------------------------------- // interfaces // ----------------------------------------------------------------------------  type interface {   // other methods   handle(handler *handler) } type somethingimpl struct {   handlers []handler }  type handler interface {   incomingcall(request *incomingrequest) }  // ---------------------------------------------------------------------------- // somethingimpl implementation // ---------------------------------------------------------------------------- func newsomething() {   u := new(somethingimpl)   // more operations u   return u } func (l *somethingimpl) handle(handler *handler) {   fmt.printf("handler: %s", handler) } 

file main.go

package main import (   "fmt"   )  type myhandler struct {} func (h *myhandler) incomingcall(request *somepkg.incomingrequest) {   fmt.printf("handler!") }  func main() {   mysomething := somepkg.newsomething()     handler := new(myhandler)   // works far.   mysomething.handle(handler) // <-- here compilation error occurs } 

trying run go build yields following compilation error:

{...}\main.go:20: cannot use handler (type *myhandler) type *somepkg.handler in argument mysomething.handle:     *somepkg.handler pointer interface, not interface 

whereas main.go:20 refers line above i'm calling mysomething.handle(handler).

actually, both myhandler , somepkg.handler seem pointers. both of them implement same methods.

why compiler not consider these types compatible ?

you have method;

func (l *somethingimpl) handle(handler *handler) {   fmt.printf("handler: %s", handler) } 

defined take interface pointer not want. you're looking have *myhandler implement handler interface rather myhandler (or both could) can pass reference type method.

//new method sig handle(handler handler) // preferred syntax assignment here handler := &myhandler{} // works fine mysomething.handle(handler) 

if want keep method sig how have it, make code work need mysomething.handle(&handler) i'm doubtful that's want do.

btw; in code *myhandler implementing interface due method func (h *myhandler) incomingcall(request *somepkg.incomingrequest) haveing *myhandler receiving type apposed func (h myhandler) make myhandler implements handler interface. little go nuance recievers , interfaces there.


Comments

Popular posts from this blog

Android : Making Listview full screen -

javascript - Parse JSON from the body of the POST -

javascript - Chrome Extension: Interacting with iframe embedded within popup -