Go Level Up
268 subscribers
3 photos
5 links
Go Hard or Go Home

Контакт для связи со мной: @sQUARyss
Download Telegram
Всем привет⚡️ Читая ваши фидбэки понял, что в канале аудитория абсолютно разная. Поэтому решил создать мини-опрос📊 чтобы в дальнейшем контент был максимально полезным и понятным для всех👨‍💻
Anonymous Poll
15%
Вкатывающийся - ничего не знаю о Go, но очень хочу узнать
11%
Начинающий - начал изучение Go и Backend
23%
Стажер - знаю базу разработки на Go, но нет опыта
17%
Junior - имею небольшой опыт работы в сфере Backend
34%
Middle/Senior - уверенно пишу, есть опыт работы в разных компаниях
👋Привет всем от автора канала СТАЖИРОВКИ в IT и Digital | Как найти первую работу

Меня зовут Гелия – я опытный IT-рекрутер.

Что ты найдешь в этом канале:
🌸 Свежие вакансии для начинающих и стажировки в IT и Digital;
🌸 Секреты и фишки как быстрее найти работу в IT (даже если ты новичок);
🌸 Советы как правильно составить резюме, чтобы тебя пригласили на собес;
🌸 Сплетни и слухи о компаниях в рубрике "Всратые работодатели".


Подписывайся СТАЖИРОВКИ в IT и Digital | Как найти первую работу
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем привет! Конспект по Mock-тестам готов🎆

В нем вы встретите:
🔘Разбор теории по мокам с практическими примерами
🔘Ответ на вопрос: "Зачем нужны моки?"
🔘Реализацию Mock-теста с помощью библиотеки gomock на примере микросервиса, написанного в предыдущем конспекте, с объяснениями каждого поля
🔘Разбор частых ошибок и объяснения как их избегать

❗️Также, напоминаю, что помимо конспекта по Mock-тестам, есть возможность приобрести конспект по написанию первого микросервиса с нуля.

Оба конспекта можно приобрести, написав мне: @sQUARyss
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁1
Go Level Up
‼️ Что выведет данный код? func printlnStrings(allStrings ...string) { for _, s := range allStrings { for i := 0; i < len(s); i++ { fmt.Print(string(s[i])) } fmt.Println(fmt.Sprintf(" %d", len(s))) } } func main() { eng := "Go Level…
Код выведет: Go Level Up 11 Ро левел ап 20

🧑‍🎓 Начнем с ответа на вопрос: "Почему не вывелось Го левел ап" - если мы вспомним теорию строк, то обратим внимание что грубо говоря строка это набор байтов. Логично, что в один байт впихнуть еще и русский язык не получится, там и так уже английские символы, цифры и базовые символы. Соответственно для кодировки русского языка нужно 2 байта‼️. НО! Так как мы итерируемся по строке поиндексно, то мы получаем каждый байт строки и в случае русского языка, где для каждого символа два байта, мы берем и выводим каждый байт отдельно. Ровно поэтому выводится не то, что мы ожидаем👍

🔜 Теперь благодаря тому, что мы знаем, что символы русского языка хранятся в двух байтах, мы можем понять почему длина в два раза больше. Важно! В два раза больше весит каждый символ, не пробелы. Поэтому у нас не 11 и 22, а 11 и 20, потому что 9 символов + 2 пробела
Please open Telegram to view this post
VIEW IN TELEGRAM
41
Привет, коллеги! 👋

Собрал для вас вопросы для мок-интервью по Go – можно потренироваться перед реальными собеседованиями.

Зачем это нужно?

🟢 Определим ваш уровень – в каждой теме поймем на какой уровень у вас знания.
🟢 Найдём слабые места – например, выяснится, что с каналами всё ок, а вот с интерфейсами – не очень.
🟢 Разберём ошибки – не только технические, но и как подаёте себя (да, софт-скиллы очень важны).
🟢 Получите конкретный фидбэк – после созвона скажу, куда копать и что подтянуть.

Если хотите "протестировать" себя – пишите, назначим время. Будет полезно 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
1221
Что выведет код?
func main() {
defer func() {
if r := recover(); r != nil {
fmt.Println("Recovered:", r)
}
}()

defer fmt.Println("1")
defer fmt.Println("2")

panic("something went wrong")
}
Код выведет: 2 1 Recovered: something went wrong.

🧑‍🎓 Начнем с defer — это ключевое слово, которое откладывает выполнение функции или команды до конца работы главной функции (в нашем случае это main). Более простым языком: всё, что попадает в defer, запускается только после выполнения всей функции, в которой он объявлен.

➡️ Теперь о порядке выполнения нескольких defer'ов. Коротко говоря, они выполняются в обратном порядке (LIFO — last in, first out 📥). Получается, первым выполняется defer с выводом "2", потом "1", и только потом recover.

Что касается recover — это некий спасатель от паники
🛡, который при её возникновении отлавливает её и не даёт программе внезапно завершиться. Но это не все его преимущества: благодаря ему мы можем не только избежать паники, но и получить и обработать сообщение этой паники. Удобно? Очень 🎆
Please open Telegram to view this post
VIEW IN TELEGRAM
21👍11
🚀 Внимание, разделяю пост для двух групп: вкатывающихся и уже попробовавших го.

🔹 Для начинающих создаю ниже опрос, который поможет понять и подготовить вам наиболее удобный и эффективный материал на тему: "С чего начать изучение Golang".

❗️Если у вас возникают трудности со стартом или в поиске информации, голосуйте!
❗️Если у вас есть идеи/желания/боли, которые помогут улучшить качество и ориентированность материала, обязательно пишите! Ваше мнение очень важно!

🔹 Для тех, кто уже имеет базу в Go, и готов попрактиковаться в написании кода в реальном времени, спешу предложить созвониться и проверить ваши силы💪

Возможные
темы для лайфкодинга:
🔘Асинхронные задачи (на worker pool и его друзей)
🔘Алгоритмы и структуры данных
🔘SQL
🔘Базовые задачи (строки, слайсы, мапы)
🔘Задачи на интерфейсы и структуры (паттерны проектирования, и SOLID)

✏️Если какие-то пункты (или все сразу) заинтересовали вас, обязательно пишите: @sQUARyss
Please open Telegram to view this post
VIEW IN TELEGRAM
21👏1😁1
Всем привет‼️ Вспомнил один интересный инструмент, который иногда спрашивают на собеседования - strings.Builder👷 Поэтому решил сделать с ним задачку, чтобы стало нагляднее) Как вы думаете, кто быстрее конкатенирует одинаковое количество элементов?
const (
iterations = 1000000
addedChar = "g"
)

func concatWithPlus(n int) string {
var s string
for i := 0; i < n; i++ {
s += addedChar
}
return s
}

func concatWithBuilder(n int) string {
var sb strings.Builder
sb.Grow(n)
for i := 0; i < n; i++ {
sb.WriteString(addedChar)
}
return sb.String()
}

func main() {
// Замерим время для '+'
start := time.Now()
concatWithPlus(iterations)
elapsedPlus := time.Since(start)

// Замерим время для Builder
start = time.Now()
concatWithBuilder(iterations)
elapsedBuilder := time.Since(start)

fmt.Printf("Конкатенация с '+': %v\n", elapsedPlus)
fmt.Printf("Конкатенация с Builder: %v\n", elapsedBuilder)
}
3👍1
Кто быстрее конкатенирует строки?
Anonymous Poll
75%
strings.Builder
7%
+
16%
Впервые слышу про Builder
2%
Примерно одинаково
Конечно же, быстрее strings.Builder

Как минимум, потому что иначе он был бы бессмысленным и я бы про него не рассказывал
🙂

Для тех кто руководствовался этой логикой, вы молодцы
👍 А для тех кто руководствовался знаниями, вы еще бОльшие молодцы🎆

Теперь ближе к делу. Почему быстрее? По сути дела при маленьких данных конкатенация обоими путями даст примерно одно и то же время
❗️, однако, когда мы переходим к большим данным и большому количеству слияний, тут Builder побеждает. Всё дело в самой логике, в случае "+" он берет две строки, создает новую строку (в большинстве случаев), копируя две старые и возвращая результат.

🔜strings.Builder при этом является простой оберткой над обычным буфером байт (советую заглянуть в его реализацию, будет полезно), который можно пре-аллоцировать, то есть заранее выделить размер памяти, чтобы ее не пересоздавать. Как мы и сделали с помощью Grow(). Таким образом мы просто забиваем буффер, не думая о копировании и каких-либо усложнениях

🔗Стоит заметить, что есть еще более быстрые варианты, просто про Builder ни раз слышал вопросы на собесах. На тему конкатенации и более глубокого сравнения, советую посмотреть пост https://habr.com/ru/articles/417479/. Думаю будет интересно как начинающим (не стоит углубляться во все что пишет автор, только начальные вещи), так и более опытным
Please open Telegram to view this post
VIEW IN TELEGRAM
53
Правильный ответ:

iota - идентификатор, позволяющий создать последовательные нетипизированные целочисленные константы


По-простому, это некий счет, который, при переходе к следующей константе, увеличивает значение на 1. Немного сложные определения и абстракции, поэтому лучше покажу примеры использования и синтаксиса:

const (
zero = iota // 0
one // 1
two // 2
)

const (
three = iota + 3 // 3
four // 4
)

const (
// Удобная история для масок
ReadPermission = 1 << iota // 1 << 0 = 1 (00000001)
WritePermission // 1 << 1 = 2 (00000010)
ExecutePermission // 1 << 2 = 4 (00000100)
)
👍221
👋 Всем привет!

Пока «Пошаговый гайд для начинающих» находится на этапе финальных разработок, напоминаю о уже готовых и проверенных работах, которые помогут перейти от основ к реальной коммерческой разработке:

💻 Конспект: «Пишем первый микросервис с нуля»:

🔘 Назначение и реализация слоев написанного микросервиса
🔘 Подводные камни межслойного взаимодействия
🔘 Ответы на наиболее интересные и актуальные вопросы
🔘 Наставления из личного опыта разработки и менторства
🔘 Ссылку на гитхаб репо с кодом

🧪 Конспект: «Mock-тестирование в Go»:

🔘 Разбор теории по мокам с практическими примерами
🔘 Ответ на вопрос: "Зачем нужны моки?"
🔘 Реализацию Mock-теста с помощью библиотеки gomock на примере микросервиса, написанного в предыдущем конспекте, с объяснениями каждого поля
🔘 Разбор частых ошибок и объяснения, как их избегать

💡 Если вы пропустили новости об этих материалах, смело пишите мне в личку, еще не поздно их опробовать!
Please open Telegram to view this post
VIEW IN TELEGRAM
21
Всем привет! Немного асинхроники вам в ленту🎆

🔜 Недавно понадобилось написать простой асинхронный запуск функций с обработкой ошибки, и вспомнил о такой классной сущности как errGroup. Она достаточно мало освещается в лентах, но от этого ее удобство и лаконичность не уменьшается)

Что же это? По сути это обертка, позволяющая забыть о sync.WaitGroup/Mutex и ручной обработке ошибок. Да, она подходит далеко не для всех асинхронных задач, но там, где ее можно заюзать, она позволяет избежать каких-то ошибок связанных с примитивами синхронизации (всё, что вы знаете из пакета sync), или с асинхронной логикой (особенно обработка ошибка), да и в целом значительно уменьшает количество кода.

🥱 Я понимаю насколько сложно читать длинные текста, поэтому ниже прикрепляю фото, на котором видно весь кайф errGroup. Безусловно пример для работы без errGroup мог бы быть попроще, но мне показался этот интереснее+те кто не встречал sync.Once глянете как он работает)

🔗Для тех, кто не любит картинки кода: https://go.dev/play/p/K57Gt2zHETm
Please open Telegram to view this post
VIEW IN TELEGRAM
👏331
Наконец-то завершил "Пошаговый гайд для начинающих"✔️

Этот гайд — именно то, чего мне не хватало, когда я начинал свой путь в Go. Теперь делюсь с вами👍

Что внутри:

🎯 Список тем, с которых необходимо начать свой путь в Go
📚 Вопросы, на которые нужно заострить свое внимание при изучении
💡 Пояснение ошибок, которые делают начинающие при изучении той или иной темы
🔗 Полезные материалы - статьи и видео, которые помогут в изучении темы


Конспекты по этой и другим темам можно приобрести в чате: @sQUARyss
Please open Telegram to view this post
VIEW IN TELEGRAM
😁221👍11