Skip to content

Commit e24b19d

Browse files
authored
Merge pull request #4105 from hozlucas28/Solution-23-Go
#23 - Go
2 parents 2ef36bc + 83014df commit e24b19d

File tree

1 file changed

+184
-0
lines changed

1 file changed

+184
-0
lines changed
Lines changed: 184 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,184 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"sync"
6+
)
7+
8+
/* -------------------------------------------------------------------------- */
9+
/* CLASSES */
10+
/* -------------------------------------------------------------------------- */
11+
12+
/* --------------------------------- Counter -------------------------------- */
13+
14+
type counter struct {
15+
__count int
16+
}
17+
18+
var counterMutex *sync.Mutex = &sync.Mutex{}
19+
20+
var counterInstance *counter
21+
22+
func Counter() *counter {
23+
if counterInstance == nil {
24+
counterMutex.Lock()
25+
defer counterMutex.Unlock()
26+
27+
if counterInstance == nil {
28+
counterInstance = &counter{}
29+
}
30+
}
31+
32+
return counterInstance
33+
}
34+
35+
func (counter *counter) getCount() int {
36+
return counter.__count
37+
}
38+
39+
func (counter *counter) decrement() *counter {
40+
counter.__count -= 1
41+
return counter
42+
}
43+
44+
func (counter *counter) increment() *counter {
45+
counter.__count += 1
46+
return counter
47+
}
48+
49+
/* --------------------------------- Session -------------------------------- */
50+
51+
type session struct {
52+
__email string
53+
__id string
54+
__name string
55+
__userName string
56+
}
57+
58+
var sessionMutex *sync.Mutex = &sync.Mutex{}
59+
60+
var sessionInstance *session
61+
62+
type SessionParams struct {
63+
email string
64+
id string
65+
name string
66+
userName string
67+
}
68+
69+
func Session(params SessionParams) *session {
70+
71+
if sessionInstance == nil {
72+
sessionMutex.Lock()
73+
defer sessionMutex.Unlock()
74+
75+
if sessionInstance == nil {
76+
sessionInstance = &session{
77+
__email: params.email,
78+
__id: params.id,
79+
__name: params.name,
80+
__userName: params.userName,
81+
}
82+
}
83+
}
84+
85+
return sessionInstance
86+
}
87+
88+
func (session *session) getEmail() string {
89+
return session.__email
90+
}
91+
92+
func (session *session) getId() string {
93+
return session.__id
94+
}
95+
96+
func (session *session) getName() string {
97+
return session.__name
98+
}
99+
100+
func (session *session) getUserName() string {
101+
return session.__userName
102+
}
103+
104+
func (session *session) setEmail(newEmail string) *session {
105+
session.__email = newEmail
106+
return session
107+
}
108+
109+
func (session *session) setId(newId string) *session {
110+
session.__id = newId
111+
return session
112+
}
113+
114+
func (session *session) setName(newName string) *session {
115+
session.__name = newName
116+
return session
117+
}
118+
119+
func (session *session) setUserName(newUserName string) *session {
120+
session.__userName = newUserName
121+
return session
122+
}
123+
124+
func (session *session) deleteData() *session {
125+
session.__email = ""
126+
session.__id = ""
127+
session.__name = ""
128+
session.__userName = ""
129+
130+
return session
131+
}
132+
133+
/* -------------------------------------------------------------------------- */
134+
/* MAIN */
135+
/* -------------------------------------------------------------------------- */
136+
137+
func main() {
138+
/*
139+
Singleton pattern...
140+
*/
141+
142+
fmt.Println("Singleton pattern...")
143+
144+
var counter01 *counter = Counter()
145+
var counter02 *counter = Counter()
146+
147+
fmt.Printf("\nAre `counter01` and `counter02` the same instance of `counter` class? %t\n", counter01 == counter02)
148+
149+
fmt.Println("\nMethod call of `counter01` instance...")
150+
151+
counter01.increment().increment().increment()
152+
fmt.Println("\ncounter01.increment().increment().increment()")
153+
154+
fmt.Printf("\nCount attribute of `counter01` instance --> %d\n", counter01.getCount())
155+
156+
fmt.Println("\nMethod call of `counter02` instance...")
157+
158+
counter02.decrement()
159+
fmt.Println("\ncounter02.decrement()")
160+
161+
fmt.Printf("\nCount attribute of `counter02` instance --> %d\n", counter02.getCount())
162+
163+
fmt.Println("\n# ---------------------------------------------------------------------------------- #")
164+
165+
/*
166+
Additional challenge...
167+
*/
168+
169+
fmt.Println("\nAdditional challenge...")
170+
171+
var userSession *session = Session(SessionParams{
172+
173+
id: "11U-287O-25ZK",
174+
name: "Mariano",
175+
userName: "MarianoPro360",
176+
})
177+
178+
fmt.Printf("\nUser session data: %s %s %s %s\n", userSession.getId(), userSession.getName(), userSession.getUserName(), userSession.getEmail())
179+
180+
userSession.deleteData()
181+
fmt.Println("\nUser session data deleted!")
182+
183+
fmt.Printf("\nUser session data: %s %s %s %s", userSession.getId(), userSession.getName(), userSession.getUserName(), userSession.getEmail())
184+
}

0 commit comments

Comments
 (0)