The following program runs fine.
package main
import (
"fmt"
)
type Person interface {
Hello()
}
type Joker struct {
Name string
}
func (j Joker) Hello() {
fmt.Println(j.Name, "says, \"Hello!\"")
}
func main() {
var j Joker = Joker{"Peter"}
invokeHello(j)
}
func invokeHello(p Person) {
p.Hello()
}
Here is the output.
$ go run foo.go
Peter says, "Hello!"
But when I change the Hello
method to receive a pointer, I get errors.
package main
import (
"fmt"
)
type Person interface {
Hello()
}
type Joker struct {
Name string
}
func (j *Joker) Hello() {
fmt.Println(j.Name, "says, \"Hello!\"")
}
func main() {
var j *Joker = &Joker{"Peter"}
invokeHello(j)
}
func invokeHello(p *Person) {
p.Hello()
}
Here are the errors.
$ go run bar.go
# command-line-arguments
./bar.go:21: cannot use j (type *Joker) as type *Person in argument to invokeHello:
*Person is pointer to interface, not interface
./bar.go:25: p.Hello undefined (type *Person has no field or method Hello)
How can I fix the second program?