Skip to content

Instantly share code, notes, and snippets.

@tanatana
Created November 16, 2014 18:27
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tanatana/92d401670092fcfd164d to your computer and use it in GitHub Desktop.
Save tanatana/92d401670092fcfd164d to your computer and use it in GitHub Desktop.
package main
import(
"fmt"
"reflect"
)
func main() {
var hp, cp, wp, crp Printer
hp = NewHelloPrinter()
cp = NewCommaPrinter()
wp = NewWorldPrinter()
crp = NewCRPrinter()
v := reflect.TypeOf(hp)
v2 := reflect.TypeOf(new(HelloPrinter))
fmt.Printf("%v\n", v)
fmt.Printf("%v\n", v.Elem())
fmt.Printf("%v\n", v == v2)
fmt.Printf("%v\n", v.FieldByName)
hp.Print()
cp.Print()
wp.Print()
crp.Print()
}
type Printer interface {
Print()
}
type rowPrinter struct {
message string
}
func (rp *rowPrinter)Print() {
fmt.Print(rp.message)
}
type HelloPrinter struct {
rowPrinter
}
func NewHelloPrinter() Printer{
hp := new(HelloPrinter)
hp.message = "Hello"
return hp
}
type CommaPrinter struct {
rowPrinter
}
func NewCommaPrinter() Printer{
cp := new(CommaPrinter)
cp.message = ", "
return cp
}
type WorldPrinter struct {
rowPrinter
}
func NewWorldPrinter() Printer{
wp := new(WorldPrinter)
wp.message = "world"
return wp
}
type CRPrinter struct {
rowPrinter
}
func NewCRPrinter() Printer{
crp := new(CRPrinter)
crp.message = "\n"
return crp
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment