├── .gitignore
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | # Вопросы для собеседования по Go
3 |
4 | :information_source: В этом репозитории содержаться вопросы и ответы с помощью которых вы можете подготовиться к собеседованию по Golang
5 |
6 | :iphone: Telegram-канал - [@golangquiz](https://t.me/golangquiz)
7 |
8 | :bar_chart: Вопросов - 14.
9 |
10 | :pencil: Вы можете добавить свой вопрос или обьяснение, исправить/дополнить существующий с помощью пул реквеста :)
11 |
12 | # Todo:
13 | - разделить вопросы по категориям
14 | - разделить вопросы по сложности
15 |
16 | # Список вопросов и ответов
17 |
18 |
19 | 1. Какие основные фичи GO?
20 |
21 | * Сильная статическая типизация - тип переменных не может быть изменен с течением времени, и они должны быть определены во время компиляции
22 | * Быстрое время компиляции
23 | * Встроенная конкурентность
24 | * Встроеный сборщик мусора
25 | * Компилируется в один бинарник - все, что вам нужно для запуска приложения. Очень полезно для управления версиями во время выполнения.
26 |
27 |
28 |
29 |
30 | 2. Что выведет код?
31 |
32 | ```golang
33 | package main
34 |
35 | import (
36 | "fmt"
37 | "sync"
38 | "time"
39 | )
40 |
41 | func main() {
42 | var wg sync.WaitGroup
43 |
44 | wg.Add(1)
45 | go func() {
46 | time.Sleep(time.Second * 2)
47 | fmt.Println("1")
48 | wg.Done()
49 | }()
50 |
51 | go func() {
52 | fmt.Println("2")
53 | }()
54 |
55 | wg.Wait()
56 | fmt.Println("3")
57 | }
58 | ````
59 |
60 |
61 | Ответ
62 | всегда 2 1 3
63 |
64 |
65 |
66 |
67 |
68 | 3. Что выведет код?
69 |
70 | ```golang
71 | package main
72 |
73 | import (
74 | "context"
75 | "fmt"
76 | "time"
77 | )
78 |
79 | func main() {
80 | timeout := 3 * time.Second
81 | ctx, cancel := context.WithTimeout(context.Background(), timeout)
82 | defer cancel()
83 |
84 | select {
85 | case <-time.After(1 * time.Second):
86 | fmt.Println("waited for 1 sec")
87 | case <-time.After(2 * time.Second):
88 | fmt.Println("waited for 2 sec")
89 | case <-time.After(3 * time.Second):
90 | fmt.Println("waited for 3 sec")
91 | case <-ctx.Done():
92 | fmt.Println(ctx.Err())
93 | }
94 | }
95 | ```
96 |
97 |
98 | Ответ
99 | waited for 1 sec
100 |
101 |
102 |
103 |
104 |
105 | 4. Что выведет код?
106 |
107 | ```golang
108 | package main
109 |
110 | import (
111 | "container/heap"
112 | "fmt"
113 | )
114 |
115 | type IntHeap []int
116 |
117 | func (h IntHeap) Len() int { return len(h) }
118 | func (h IntHeap) Less(i, j int) bool { return h[i] < h[j] }
119 | func (h IntHeap) Swap(i, j int) { h[i], h[j] = h[j], h[i] }
120 |
121 | func (h *IntHeap) Push(x interface{}) {
122 | *h = append(*h, x.(int))
123 | }
124 |
125 | func (h *IntHeap) Pop() interface{} {
126 | old := *h
127 | n := len(old)
128 | x := old[n-1]
129 | *h = old[0 : n-1]
130 | return x
131 | }
132 |
133 | func main() {
134 | h := &IntHeap{2, 1, 5}
135 | heap.Init(h)
136 | fmt.Printf("first: %d\n", (*h)[0])
137 | }
138 | ```
139 |
140 |
141 | Ответ
142 | first: 1
143 |
144 |
145 |
146 |
147 |
148 | 5. Что выведет код?
149 |
150 | ```golang
151 | package main
152 |
153 | import (
154 | "fmt"
155 | )
156 |
157 | func mod(a []int) {
158 | // Как и почему изменится вывод если раскомментировать строку ниже?
159 | // a = append(a, 125)
160 |
161 | for i := range a {
162 | a[i] = 5
163 | }
164 |
165 | fmt.Println(a)
166 | }
167 |
168 | func main() {
169 | sl := []int{1, 2, 3, 4}
170 | mod(sl)
171 | fmt.Println(sl)
172 | }
173 | ```
174 |
175 |
176 | Ответ
177 | [5 5 5 5]
178 | [5 5 5 5]
179 | если раскомментировать `a = append(a, 125)`
180 | [5 5 5 5 5]
181 | [1 2 3 4]
182 |
183 |
184 |
185 |
186 |
187 | 6. Что выведет код? (тема - defer)
188 |
189 | ```golang
190 | package main
191 |
192 | import (
193 | "fmt"
194 | )
195 |
196 | func main() {
197 | i := 0
198 | defer fmt.Println(i)
199 | i++
200 | return
201 | }
202 | ```
203 |
204 |
205 | Ответ
206 | 0
207 |
208 |
209 |
210 |
211 |
212 | 7. Что выведет код? (тема - defer)
213 |
214 | ```golang
215 | package main
216 |
217 | import (
218 | "fmt"
219 | )
220 |
221 | func main() {
222 | for i := 0; i < 5; i++ {
223 | defer func(i *int) {
224 | fmt.Printf("%v ", *i)
225 | }(&i)
226 | }
227 |
228 | }
229 | ```
230 |
231 |
232 | Ответ
233 | Зависит от версии компилятора.
234 |
235 | До версии 1.22 - 5 5 5 5 5
236 |
237 | Начиная с 1.22 - 4 3 2 1 0
238 |
239 |
240 |
241 |
242 |
243 | 8. Предположим, что x
объявлен, а y
не объявлен, какие пункты ниже верны?
244 |
245 | ```golang
246 | x, _ := f()
247 | x, _ = f()
248 | x, y := f()
249 | x, y = f()
250 | ```
251 |
252 |
253 | Ответ
254 | x, _ = f()
255 | x, y := f()
256 |
257 |
258 |
259 |
260 |
261 | 9. Что делает runtime.newobject()
?
262 |
263 | Выделяет память в куче.
264 | https://golang.org/pkg/runtime/?m=all#newobject
265 |
266 |
267 |
268 |
269 |
270 | 10. Что такое $GOROOT
и $GOPATH
?
271 |
272 | $GOROOT
каталог для стандартной библиотеки, включая исполняемые файлы и исходный код.
273 | $GOPATH
каталго для внешних пакетов.
274 |
275 |
276 |
277 |
278 |
279 | 11. Что выведет код? (тема - slice)
280 |
281 | ```golang
282 | package main
283 |
284 | import (
285 | "fmt"
286 | )
287 |
288 | func main() {
289 | test1 := []int{1, 2, 3, 4, 5}
290 | test1 = test1[:3]
291 | test2 := test1[3:]
292 | fmt.Println(test2[:2])
293 | }
294 | ```
295 |
296 |
297 | Ответ
298 | [4 5]
299 |
300 |
301 |
302 |
303 |
304 |
305 | 12. Перечислите функции которые могу остановить выполнение текущей горутины
306 |
307 | runtime.Gosched
308 | runtime.gopark
309 | runtime.notesleep
310 | runtime.Goexit
311 |
312 |
313 |
314 |
315 | 13. Что выведет код?
316 |
317 | ```golang
318 | x := []int{1, 2}
319 | y := []int{3, 4}
320 | ref := x
321 | x = y
322 | fmt.Println(x, y, ref)
323 | ```
324 |
325 |
326 | Ответ
327 | [3 4] [3 4] [1 2]
328 |
329 |
330 |
331 |
332 |
333 | 14. Как скопировать slice?
334 |
335 | Следует воспользоваться встроенной функцией copy
:
336 |
337 | ```golang
338 | x := []int{1, 2}
339 | y := []int{3, 4}
340 | ref := x
341 | copy(x, y)
342 | fmt.Println(x, y, ref)
343 | // Output: [3 4] [3 4] [3 4]
344 | ```
345 |
346 |
347 |
348 |
--------------------------------------------------------------------------------