From f0bfeca1cb190bdca98377b7ecf13c7c5a853f42 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Tue, 8 Feb 2022 09:42:25 +0300 Subject: [PATCH 01/10] change errata --- docs/GOLANG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/GOLANG.md b/docs/GOLANG.md index 51a5403..94883a8 100644 --- a/docs/GOLANG.md +++ b/docs/GOLANG.md @@ -154,7 +154,7 @@ GC выполняется конкурентно (concurrent), одноврем 3. Идет перебор серых объектов, проверяются ссылки на другие объекты и помечаются на черные объекты. Если есть ссылка на белый объект, то белый становится серым. 4. Продолжается до тех пор, пока не будут перебраны все серые объекты. 5. Оставшиеся после перебора белые объекты считаются недостижимыми и занимаемая ими область памяти может быть освобождена. -Есть еще Мутатор - это приложение, работающее во время сборки мусора. Вызывает функцию барьера записи. Выполняется каждый раз, когда меняется указатель в куче. После изменения указателя объект считаеться достижимым и помечается как серый. +Есть еще Мутатор - это приложение, работающее во время сборки мусора. Вызывает функцию барьера записи. Выполняется каждый раз, когда меняется указатель в куче. После изменения указателя объект считается достижимым и помечается как серый. ### 18.Что такое interface, как они работают в Go? `// todo` From d6bb099dacc1aaf5e1a5de066c67a67a00eef42c Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Wed, 9 Feb 2022 12:11:19 +0300 Subject: [PATCH 02/10] string & change errata --- README.md | 5 ++--- docs/GOLANG.md | 4 ++++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index c3ea1e7..ba566e5 100644 --- a/README.md +++ b/README.md @@ -50,13 +50,12 @@ - Что такое шардинг и репликация? - coming soon 6. [Вопросы по языку Golang](docs/GOLANG.md) - - Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк? + - [Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк?](docs/GOLANG.md#1) - Вытекающий вопрос — как эффективно склеивать множество строк? - Что будет происходить при конкурентной записи в map? Как можно решить эту проблему? - Расскажите о ООП в Golang. - В чем различия goroutine от потока системы? - Как огранить число потоков на системы при запуске Golang программы и возможно ли огранить их до 1 потока? - - Как устроен слайс и чем он отличается от массива? - [Как задать направление канала?](docs/GOLANG.md#8) - [Напишите собственную функцию Sleep, используя time.After](docs/GOLANG.md#9) - [Что такое буферизированный канал? Как создать такой канал с ёмкостью в 20 сообщений?](docs/GOLANG.md#10) @@ -119,4 +118,4 @@ ## Как мне добавить свой вопрос-ответ? -- [Ознакомтесь с шаблоном составления](TEMPLATE.md) +- [Ознакомьтесь с шаблоном составления](TEMPLATE.md) diff --git a/docs/GOLANG.md b/docs/GOLANG.md index 94883a8..ca8087b 100644 --- a/docs/GOLANG.md +++ b/docs/GOLANG.md @@ -1,5 +1,9 @@ ## Вопросы по языку Golang +### 1. Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк? + +Строка Go - это байтовый срез, предназначенный только для чтения, который может содержать байты любого типа и иметь произвольную длину. Строка неизменяемая и изменить определенный символ в конкретной строке нельзя. Создается новая строка (в простейшем случае). + ### 8. Как задать направление канала? Мы можем задать направление передачи сообщений в канале, сделав его только отправляющим или принимающим. Например: From 6206fc9c62747cf192f14e4a6d0cf186c2cb4fa4 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Wed, 9 Feb 2022 12:17:11 +0300 Subject: [PATCH 03/10] concatinate strings --- README.md | 2 +- docs/GOLANG.md | 16 +++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ba566e5..e231484 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ - coming soon 6. [Вопросы по языку Golang](docs/GOLANG.md) - [Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк?](docs/GOLANG.md#1) - - Вытекающий вопрос — как эффективно склеивать множество строк? + - [Вытекающий вопрос — как эффективно склеивать множество строк?](docs/GOLANG.md#2) - Что будет происходить при конкурентной записи в map? Как можно решить эту проблему? - Расскажите о ООП в Golang. - В чем различия goroutine от потока системы? diff --git a/docs/GOLANG.md b/docs/GOLANG.md index ca8087b..7c0297f 100644 --- a/docs/GOLANG.md +++ b/docs/GOLANG.md @@ -2,7 +2,21 @@ ### 1. Что из себя представляет тип данных string в языке Golang? Можно ли изменить определенный символ в строке? Что происходит при склеивании строк? -Строка Go - это байтовый срез, предназначенный только для чтения, который может содержать байты любого типа и иметь произвольную длину. Строка неизменяемая и изменить определенный символ в конкретной строке нельзя. Создается новая строка (в простейшем случае). +Строка Go - это байтовый срез, предназначенный только для чтения, который может содержать байты любого типа и иметь произвольную длину. Строка неизменяемая и изменить определенный символ в конкретной строке нельзя. Создается новая строка (в простейшем случае). + +### 2. Вытекающий вопрос — как эффективно склеивать множество строк? + +Например, чтобы избавиться от лишних аллокаций, можно воспользоваться типом strings.Builder и методом WriteString: +```go + func join(strs ...string) string { + var sb strings.Builder + for _, str := range strs { + sb.WriteString(str) + } + return sb.String() + } + ``` + И никто не мешает пользоваться пакетом strings. ### 8. Как задать направление канала? From b68e4a837a998781ba9c406cf42478d6734ce2e8 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Thu, 10 Feb 2022 09:43:42 +0300 Subject: [PATCH 04/10] interface, append, slice PODOLSKY --- README.md | 6 +++--- docs/PODOLSKY.md | 39 ++++++++++++++++++++++++++++++++++++++- 2 files changed, 41 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index e231484..dbefad5 100644 --- a/README.md +++ b/README.md @@ -82,9 +82,9 @@ 9. [Вопросы от Данила Подольского на позицию Senior Golang Backend Developer в компанию Evrone](docs/PODOLSKY.md) - [Go — императивный или декларативный? А в чем разница?](docs/PODOLSKY.md#1) - [Что такое type switch?](docs/PODOLSKY.md#2) - - Как сообщить компилятору, что наш тип реализует интерфейс? - - Как работает append? - - Какое у slice zero value? Какие операции над ним возможны? + - [Как сообщить компилятору, что наш тип реализует интерфейс?](docs/PODOLSKY.md#3) + - [Как работает append?](docs/PODOLSKY.md#4) + - [Какое у slice zero value? Какие операции над ним возможны?](docs/PODOLSKY.md#5) - Как устроен тип map? - Каков порядок перебора map? - Что будет, если читать из закрытого канала? diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 9633286..38825f3 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -9,4 +9,41 @@ ### Что такое type switch? -Сравнение типов переменной, а не ее значений. \ No newline at end of file +Сравнение типов переменной, а не ее значений. + +### Как сообщить компилятору, что наш тип реализует интерфейс? + +Если наш тип реализует все методы интерфейса, значит он реализует этот интерфейс. + +### Как работает append? + +Если capacity исходного массива достаточно, он используется повторно. В противном случае выделяется новый базовый массив достаточной длины и данные копируются + +### Какое у slice zero value? Какие операции над ним возможны? + +Zero value у slice == nil +Возможные операции: len, cap, append. + +### Как устроен тип map? +### Каков порядок перебора map? +### Что будет, если читать из закрытого канала? +### Что будет, если писать в закрытый канал? +### Как вы отсортируете массив структур по алфавиту по полю Name? +### Что такое сериализация? Зачем она нужна? +### Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка? +### Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему? +### Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go? +### Главный недостаток стандартного логгера? +### Есть ли для Go хороший orm? Ответ обоснуйте. +### Какой у вас любимый линтер? +### Можно ли использовать один и тот же буфер []byte в нескольких горутинах? +### Какие типы мьютексов предоставляет stdlib? +### Что такое lock-free структуры данных, и есть ли в Go такие? +### Способы поиска проблем производительности на проде? +### Стандартный набор метрик prometheus в Go -программе? +### Как встроить стандартный профайлер в свое приложение? +### Overhead от стандартного профайлера? +### Почему встраивание — не наследование? +### Какие средства обобщенного программирования есть в Go? +### Какие технологические преимущества языка Go вы можете назвать? +### Какие технологические недостатки языка Go вы можете назвать? \ No newline at end of file From 509befee652ce51998da8642d85a1df3273ce980 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Thu, 10 Feb 2022 09:52:16 +0300 Subject: [PATCH 05/10] maps --- README.md | 4 ++-- docs/PODOLSKY.md | 6 ++++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index dbefad5..a29d5da 100644 --- a/README.md +++ b/README.md @@ -85,8 +85,8 @@ - [Как сообщить компилятору, что наш тип реализует интерфейс?](docs/PODOLSKY.md#3) - [Как работает append?](docs/PODOLSKY.md#4) - [Какое у slice zero value? Какие операции над ним возможны?](docs/PODOLSKY.md#5) - - Как устроен тип map? - - Каков порядок перебора map? + - [Как устроен тип map?](docs/PODOLSKY.md#6) + - [Каков порядок перебора map?](docs/PODOLSKY.md#7) - Что будет, если читать из закрытого канала? - Что будет, если писать в закрытый канал? - Как вы отсортируете массив структур по алфавиту по полю Name? diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 38825f3..861c046 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -25,7 +25,13 @@ Zero value у slice == nil Возможные операции: len, cap, append. ### Как устроен тип map? + +Map в Go это хэш таблица, позволяющая хранить пары ключ-значение и обладающая следующими функциями: маппинг, вставка, удаление, поиск. Map in Go не упорядоченная. Место поиска определяется рандомно. Когда мы пытаемся получить значение из мапы, а его там нет, получаем «нулевое значение типа», что в случае числа 0. Map — ссылочный тип и мало объявить переменную, надо ее проинициализировать. + ### Каков порядок перебора map? + +Случайным образом. + ### Что будет, если читать из закрытого канала? ### Что будет, если писать в закрытый канал? ### Как вы отсортируете массив структур по алфавиту по полю Name? From 55f8ad3a3ab53bfec191f47e56ab6ecb581de5f9 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Tue, 15 Feb 2022 12:18:21 +0300 Subject: [PATCH 06/10] channel, array --- README.md | 42 +++++++++++++++++++------------------- docs/PODOLSKY.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 73 insertions(+), 22 deletions(-) diff --git a/README.md b/README.md index a29d5da..98ea1ed 100644 --- a/README.md +++ b/README.md @@ -87,27 +87,27 @@ - [Какое у slice zero value? Какие операции над ним возможны?](docs/PODOLSKY.md#5) - [Как устроен тип map?](docs/PODOLSKY.md#6) - [Каков порядок перебора map?](docs/PODOLSKY.md#7) - - Что будет, если читать из закрытого канала? - - Что будет, если писать в закрытый канал? - - Как вы отсортируете массив структур по алфавиту по полю Name? - - Что такое сериализация? Зачем она нужна? - - Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка? - - Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему? - - Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go? - - Главный недостаток стандартного логгера? - - Есть ли для Go хороший orm? Ответ обоснуйте. - - Какой у вас любимый линтер? - - Можно ли использовать один и тот же буфер []byte в нескольких горутинах? - - Какие типы мьютексов предоставляет stdlib? - - Что такое lock-free структуры данных, и есть ли в Go такие? - - Способы поиска проблем производительности на проде? - - Стандартный набор метрик prometheus в Go -программе? - - Как встроить стандартный профайлер в свое приложение? - - Overhead от стандартного профайлера? - - Почему встраивание — не наследование? - - Какие средства обобщенного программирования есть в Go? - - Какие технологические преимущества языка Go вы можете назвать? - - Какие технологические недостатки языка Go вы можете назвать? + - [Что будет, если читать из закрытого канала?](docs/PODOLSKY.md#8) + - [Что будет, если писать в закрытый канал?](docs/PODOLSKY.md#9) + - [Как вы отсортируете массив структур по алфавиту по полю Name?](docs/PODOLSKY.md#10) + - [Что такое сериализация? Зачем она нужна?](docs/PODOLSKY.md#11) + - [Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка?](docs/PODOLSKY.md#12) + - [Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему?](docs/PODOLSKY.md#13) + - [Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go?](docs/PODOLSKY.md#14) + - [Главный недостаток стандартного логгера?](docs/PODOLSKY.md#15) + - [Есть ли для Go хороший orm? Ответ обоснуйте.](docs/PODOLSKY.md#16) + - [Какой у вас любимый линтер?](docs/PODOLSKY.md#17) + - [Можно ли использовать один и тот же буфер []byte в нескольких горутинах?](docs/PODOLSKY.md#18) + - [Какие типы мьютексов предоставляет stdlib?](docs/PODOLSKY.md#19) + - [Что такое lock-free структуры данных, и есть ли в Go такие?](docs/PODOLSKY.md#20) + - [Способы поиска проблем производительности на проде?](docs/PODOLSKY.md#21) + - [Стандартный набор метрик prometheus в Go -программе?](docs/PODOLSKY.md#22) + - [Как встроить стандартный профайлер в свое приложение?](docs/PODOLSKY.md#23) + - [Overhead от стандартного профайлера?](docs/PODOLSKY.md#24) + - [Почему встраивание — не наследование?](docs/PODOLSKY.md#25) + - [Какие средства обобщенного программирования есть в Go?](docs/PODOLSKY.md#26) + - [Какие технологические преимущества языка Go вы можете назвать?](docs/PODOLSKY.md#27) + - [Какие технологические недостатки языка Go вы можете назвать?](docs/PODOLSKY.md#28) 10. [Популярные задачи на собеседованиях](docs/POPULAR_TASKS.md) - [На вход подаются два неупорядоченных слайса любой длины. Надо написать функцию, которая возвращает их пересечение](docs/POPULAR_TASKS.md#1) - [Написать генератор случайных чисел](docs/POPULAR_TASKS.md#2) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 861c046..4de4a34 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -33,23 +33,74 @@ Map в Go это хэш таблица, позволяющая хранить п Случайным образом. ### Что будет, если читать из закрытого канала? + +Вернется нулевое значение. + ### Что будет, если писать в закрытый канал? + +Произойдет вызов panic. + ### Как вы отсортируете массив структур по алфавиту по полю Name? + +С помощью функции sort.SliceStable. Для этого сначала конвертируем массив в слайс. +```go +slice := array[:] +``` + ### Что такое сериализация? Зачем она нужна? + + + ### Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка? + + + ### Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему? + + + ### Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go? + + + ### Главный недостаток стандартного логгера? + + ### Есть ли для Go хороший orm? Ответ обоснуйте. + + ### Какой у вас любимый линтер? + + ### Можно ли использовать один и тот же буфер []byte в нескольких горутинах? + + ### Какие типы мьютексов предоставляет stdlib? + + ### Что такое lock-free структуры данных, и есть ли в Go такие? + + ### Способы поиска проблем производительности на проде? + + ### Стандартный набор метрик prometheus в Go -программе? + + ### Как встроить стандартный профайлер в свое приложение? + + ### Overhead от стандартного профайлера? + + ### Почему встраивание — не наследование? + + ### Какие средства обобщенного программирования есть в Go? + + ### Какие технологические преимущества языка Go вы можете назвать? -### Какие технологические недостатки языка Go вы можете назвать? \ No newline at end of file + + +### Какие технологические недостатки языка Go вы можете назвать? + From fc7c4209ef729e0544022451f66fdaf5010a60d5 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Tue, 15 Feb 2022 12:20:43 +0300 Subject: [PATCH 07/10] =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B8=D0=B0=D0=BB?= =?UTF-8?q?=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D0=B8=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=80=D0=B0=D1=89=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=BF=D0=B8?= =?UTF-8?q?=D1=81=D0=BA=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/PODOLSKY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 4de4a34..80c2033 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -49,11 +49,11 @@ slice := array[:] ### Что такое сериализация? Зачем она нужна? - +Сериализация — это преобразование объекта в какой-либо формат с тем, чтобы потом tuj можно было восстановить из этого формата. Допустим, после передачи как набора байт по сети. ### Сколько времени в минутах займет у вас написание процедуры обращения односвязного списка? - +Тут каждый считает сам. Попробуйте с таймингом (засеките время). ### Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему? From 176740de2b19c22994bafad3e0bd2427a6bd1efb Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Tue, 15 Feb 2022 12:33:20 +0300 Subject: [PATCH 08/10] interface --- docs/PODOLSKY.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index 80c2033..d39074c 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -57,7 +57,7 @@ slice := array[:] ### Где следует поместить описание интерфейса: в пакете с реализацией или в пакете, где этот интерфейс используется? Почему? - +Небольшое копирование лучше, чем небольшая зависимость. Даже в стандартной библиотеке есть места, где те же io.Reader или fmt.Stringer переопределены, чтобы избежать ненужной зависимости от других пакетов. Если интерфейс маленький, скопировать его не составит труда, а если он большой, то есть вероятность, что в будущем одному модулю понадобятся одни методы, а другому - другие. ### Предположим, ваша функция должна возвращать детализированные Recoverable и Fatal ошибки. Как это реализовано в пакете net? Как это надо делать в современном Go? @@ -84,7 +84,7 @@ slice := array[:] ### Способы поиска проблем производительности на проде? -### Стандартный набор метрик prometheus в Go -программе? +### Стандартный набор метрик prometheus в Go-программе? ### Как встроить стандартный профайлер в свое приложение? From d158a9e3d6dac7d586ec61cc1c1ed07bda24a8a2 Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Tue, 22 Feb 2022 14:44:12 +0300 Subject: [PATCH 09/10] =?UTF-8?q?=D0=BE=D0=B1=D0=BE=D0=B1=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=BE=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D0=BC=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D0=B8=20ORM?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- docs/PODOLSKY.md | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 723ef36..d48c759 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.idea \ No newline at end of file +.idea +.vscode \ No newline at end of file diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index d39074c..dec1cda 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -68,6 +68,7 @@ slice := array[:] ### Есть ли для Go хороший orm? Ответ обоснуйте. +Для работы с базами данных можно использовать пакет database/sql. Но есть куча ORM, можно выбрать любую. Все зависит от исходной посылки. ### Какой у вас любимый линтер? @@ -98,6 +99,7 @@ slice := array[:] ### Какие средства обобщенного программирования есть в Go? +Обобщенное программирование — это форма, в которой мы подключаем шаблоны, известные как дженерики, которые на самом деле не являются истинным исходным кодом, но компилируются компилятором для преобразования их в исходный код. [Дженерики будут](https://go.googlesource.com/proposal/+/refs/heads/master/design/43651-type-parameters.md) с версии 1.18. ### Какие технологические преимущества языка Go вы можете назвать? From e1b6fde164745f9d792fe86be127614f83e822ad Mon Sep 17 00:00:00 2001 From: dreddsa5dies Date: Tue, 22 Feb 2022 14:45:53 +0300 Subject: [PATCH 10/10] =?UTF-8?q?=D0=BB=D0=B8=D0=BD=D1=82=D0=B5=D1=80?= =?UTF-8?q?=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/PODOLSKY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/PODOLSKY.md b/docs/PODOLSKY.md index dec1cda..a809fbe 100644 --- a/docs/PODOLSKY.md +++ b/docs/PODOLSKY.md @@ -72,6 +72,7 @@ slice := array[:] ### Какой у вас любимый линтер? +Go vet + golint ### Можно ли использовать один и тот же буфер []byte в нескольких горутинах?