Skip to content

Instantly share code, notes, and snippets.

@deinspanjer
Forked from anonymous/test_a_sayer.go
Created November 9, 2016 16:25
Show Gist options
  • Save deinspanjer/14b34f4c2e05a9be7c5c5ce941c34ddc to your computer and use it in GitHub Desktop.
Save deinspanjer/14b34f4c2e05a9be7c5c5ce941c34ddc to your computer and use it in GitHub Desktop.
Example of cross-package interfaces in golang
package a
import "fmt"
type Sayer interface {
Say() string
}
type Formal struct{}
func (p Formal) Greet(s interface{Sayer}) string {
return fmt.Sprintf("Hello, %s", s.Say())
}
package b
import "fmt"
type Sayer interface {
Say() string
}
type Casual struct{}
func (p Casual) Greet(s interface{Sayer}) string {
return fmt.Sprintf("Hey %s!", s.Say())
}
package greet
type Sayer interface {
Say() string
}
type Greeter interface {
Greet(s interface{Sayer}) string
}
func Greet(g interface{Greeter}, i Sayer) string {
return g.Greet(i)
}
package main
import (
"log"
"test/a"
"test/b"
"test/greet"
)
type Who struct {
to string
}
func (w Who) Say() string {
return w.to
}
type Bad struct {
to string
}
func (w Bad) Say(exclaim bool) string {
said := w.to
if exclaim {
said += "!!!"
}
return said
}
func main() {
log.Println("Testing...")
a := a.Formal{}
b := b.Casual{}
w := &Who{
to:"world",
}
x := &Bad{
to:"world",
}
log.Println(greet.Greet(a, w))
log.Println(greet.Greet(b, w))
//log.Println(greet.Greet(b, x))
}
@frops
Copy link

frops commented Aug 29, 2018

Thanks. Good example

@dcormier
Copy link

In your method signatures, just use the interface types themselves. As you have them now, they declare new anonymous types that embed the type you actually care about.

E.g., instead of Greet(s interface{Sayer}), you would just use Greet(s Sayer). And instead of Greet(g interface{Greeter}, i Sayer) you would just use Greet(g Greeter, i Sayer).

@klide6ix
Copy link

Thanks. It's very helpful

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment