Skip to content

Instantly share code, notes, and snippets.

Created November 9, 2016 16:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save anonymous/e1f04d24747f04111c72007a7cc1bc9f to your computer and use it in GitHub Desktop.
Save anonymous/e1f04d24747f04111c72007a7cc1bc9f 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
}
func main() {
log.Println("Testing...")
a := a.Formal{}
b := b.Casual{}
w := &Who{
to:"world",
}
log.Println(greet.Greet(a, w))
log.Println(greet.Greet(b, w))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment