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))
}
@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