-
Notifications
You must be signed in to change notification settings - Fork 1
/
TestPersonne.go
112 lines (95 loc) · 2.14 KB
/
TestPersonne.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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*
Golang version 1.12
go build -o TestPersonne TestPersonne.go
*/
package main
import (
"fmt"
"strconv"
)
// Go n'est pas un langage objet
// Pas d'héritage ... Mais on peut faire de la composition
// Person Interface
type Person interface {
toString() string
}
// Struct Person
type person struct {
toStr func() string
nom string
prenom string
}
// Etudiant Interface
type Etudiant interface {
Person
}
// Struct Etudiant
type etudiant struct {
person
num int
}
// NewPerson Struct Person + méthode toStr
func NewPerson(nom string, prenom string) *person {
p := &person{nom: nom, prenom: prenom}
p.toStr = p.toString
return p
}
// Retourne une chaine qui représente la structure Person
func (p *person) toString() string {
return fmt.Sprintf("%v %v", p.nom, p.prenom)
}
// NewEtudiant Struct Etudiant composée de Person + méthode toStr
func NewEtudiant(nom string, prenom string, num int) *etudiant {
e := &etudiant{
person: person{nom: nom, prenom: prenom},
num: num,
}
e.toStr = e.toString
return e
}
// Retourne une chaine qui représente la structure Etudiant
func (e *etudiant) toString() string {
return fmt.Sprintf("%v Student %v", e.person.toString(), strconv.Itoa(e.num))
}
// print with toString (interface)
func toString(p Person) {
println(p.toString())
}
func main() {
// Struct
p := NewPerson("Duchemin", "paul")
fmt.Println(p.toStr())
// Collection
var al1 []*person
for i := 1; i <= 10; i++ {
is := strconv.Itoa(i)
al1 = append(al1, NewPerson("Duchemin"+is, "Paul"+is))
}
for _, v := range al1 {
println(v.toStr())
}
// Mixed Interface (mixed structs)
al2 := make([]interface{}, 0) // mix structs
NbEtudiant := 0
for i := 1; i <= 10; i++ {
is := strconv.Itoa(i)
if i%2 == 0 {
al2 = append(al2, NewPerson("Duchemin"+is, "Paul"+is))
} else {
al2 = append(al2, NewEtudiant("Durand"+is, "Jules"+is, i))
NbEtudiant = NbEtudiant + 1
}
}
for _, e := range al2 {
// Type assertion
switch e := e.(type) {
case *person:
toString(e)
case *etudiant:
toString(e)
default:
panic(fmt.Sprintf("type non supporté: %T", e))
}
}
println("Nb Etudiants: ", strconv.Itoa(NbEtudiant))
}