-
Notifications
You must be signed in to change notification settings - Fork 1
/
type-switch.go
47 lines (39 loc) · 1.14 KB
/
type-switch.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package main
import "fmt"
// START DEF OMIT
type Greeter interface {
Greet() string
}
// Please don't format your code like this, it's just to make it fit!
type FrenchGreeter struct { nom string }
func (n *FrenchGreeter) SetNom(nom string) { n.nom = nom }
func (n *FrenchGreeter) Greet() string {
return fmt.Sprintf("Bonjour, %s!", n.nom)
}
type EnglishGreeter struct { name string }
func (n *EnglishGreeter) SetName(name string) { n.name = name }
func (n *EnglishGreeter) Greet() string {
return fmt.Sprintf("Hello, %s!", n.name)
}
// Empty struct can be used if you want to implement an interface with no storage
type GenericGreeter struct{}
func (g *GenericGreeter) Greet() string { return "Hi!" }
// END DEF OMIT
// START MAIN OMIT
func PrintWelcome(greeter Greeter, name string) {
switch g := greeter.(type) {
case *FrenchGreeter:
g.SetNom(name)
case *EnglishGreeter:
g.SetName(name)
default:
fmt.Println("Warning: Don't know how to set name...")
}
fmt.Println(greeter.Greet())
}
func main() {
PrintWelcome(&FrenchGreeter{}, "Alice")
PrintWelcome(&EnglishGreeter{}, "Bob")
PrintWelcome(&GenericGreeter{}, "Mr Nobody")
}
// END MAIN OMIT