Please open Telegram to view this post
VIEW IN TELEGRAM
Что должно быть в разборе Mock-тестов 🧐
Anonymous Poll
64%
Разбор наиболее используемого решения в коммерции - генераторов моков ⚡️
27%
Самописная реализация моков с нуля ⚡️
32%
Наглядные примеры антипаттернов моков, которые встречаются 📛
45%
Теория по мокам, что это такое и зачем нужно, чем удобно в коммерции 👨💻
59%
Примеры для мока конкретных запросов БД или http, используя готовые либы📔
‼️ Что выведет данный код? Для тех кто не знаком с reflect'ом оставил комменты 💬
func checkType(value interface{}) string {
// в кейсе получаем тип value и сравниваем его
//со стандартными с помощью пакета reflect
switch t := reflect.TypeOf(value); t.Kind() {
case reflect.String:
return "Это строка"
case reflect.Uint8:
return "Это байт (uint8)"
case reflect.Int32: // rune - это псевдоним для int32
return "Это руна (int32)"
}
return ""
}
func main() {
s := "Go Level Up"
for i := 0; i < len(s); i++ {
fmt.Println(checkType(s[i]))
break
}
for _, v := range s {
fmt.Println(checkType(v))
break
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Код выведет: Это байт (uint8) Это руна (int32)
На самом деле данный код просто дает ответ на вопрос: "А что такое строка в Го?" 🧐
Начнем тогда с ответа на данный вопрос: строка в Go - тип данных, состоящий из указателя на последовательность байтов и длины этой последовательности. Более грубая и простая формулировка: ‼️ Строка в Go - набор байтов! Зная это, мы теперь спокойно можем сказать, почему первый цикл выдал нам "Это байт"
А почему второй цикл выдал, что это руна⁉️ Он же по сути также итерируется, НО нет, for range в Go в целом достаточно могущественная вещь и с ним надо быть внимательным. В данном случае for range итерируется не по каждому байту, а по каждому символу. Зачем? Дело в том, что в один байт невозможно впихнуть всё, что может быть в строке ☹️ По сути в него вмещается только набор символов кодировки UTF-8 (если вкратце: английский язык, числа и ряд символов). А что делать с русским, китайским, эмодзи?! Собственно для этого и придуманы руны - алиас над типом int32. Они позволяют хранить в одной ячейке не один байт, а сразу четыре, и рассматривать строку не как набор байт, а как набор рун (символов) 🎆 Поэтому чтобы итерироваться по строке посимвольно вам надо либо ее приводить к набору рун, либо for range сделает это за вас
На самом деле данный код просто дает ответ на вопрос: "А что такое строка в Го?"
Начнем тогда с ответа на данный вопрос: строка в Go - тип данных, состоящий из указателя на последовательность байтов и длины этой последовательности. Более грубая и простая формулировка: ‼️ Строка в Go - набор байтов! Зная это, мы теперь спокойно можем сказать, почему первый цикл выдал нам "Это байт"
А почему второй цикл выдал, что это руна
Please open Telegram to view this post
VIEW IN TELEGRAM
Коллеги, всем привет 👋
Многие спрашивают в личных чатах веду ли я индивидуальные занятия менторства, поэтому решил написать общий пост💬
🧑🎓 Конечно, веду, если у кого-то есть сложности в написании кода, освоении новой технологии или вы понимаете, что какая-то теория вам не поддается, смело пишите! Обсудим с вами как это можно решить, и что-нибудь обязательно придумаем!
Многие спрашивают в личных чатах веду ли я индивидуальные занятия менторства, поэтому решил написать общий пост
Please open Telegram to view this post
VIEW IN TELEGRAM
1 3❤2😁1
‼️ Что выведет данный код?
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 Up"
rus := "Го левел ап"
printlnStrings(eng, rus)
}Всем привет⚡️ Читая ваши фидбэки понял, что в канале аудитория абсолютно разная. Поэтому решил создать мини-опрос📊 чтобы в дальнейшем контент был максимально полезным и понятным для всех👨💻
Anonymous Poll
15%
Вкатывающийся - ничего не знаю о Go, но очень хочу узнать
11%
Начинающий - начал изучение Go и Backend
23%
Стажер - знаю базу разработки на Go, но нет опыта
17%
Junior - имею небольшой опыт работы в сфере Backend
34%
Middle/Senior - уверенно пишу, есть опыт работы в разных компаниях
Меня зовут Гелия – я опытный IT-рекрутер.
Что ты найдешь в этом канале:
Подписывайся
Please open Telegram to view this post
VIEW IN TELEGRAM
Telegram
СТАЖИРОВКИ в IT и Digital | Как найти первую работу
● Вакансии и стажировки в IT и Digital;
● Тут ты узнаешь как найти работу в IT;
● Хочешь проф. резюме от IT-рекрутера? Напиши сюда @geliyaereshova;
● Тут ты узнаешь как найти работу в IT;
● Хочешь проф. резюме от IT-рекрутера? Напиши сюда @geliyaereshova;
Всем привет! Конспект по Mock-тестам готов🎆
В нем вы встретите:
🔘 Разбор теории по мокам с практическими примерами
🔘 Ответ на вопрос: "Зачем нужны моки?"
🔘 Реализацию Mock-теста с помощью библиотеки gomock на примере микросервиса, написанного в предыдущем конспекте, с объяснениями каждого поля
🔘 Разбор частых ошибок и объяснения как их избегать
❗️ Также, напоминаю, что помимо конспекта по Mock-тестам, есть возможность приобрести конспект по написанию первого микросервиса с нуля.
Оба конспекта можно приобрести, написав мне: @sQUARyss
В нем вы встретите:
Оба конспекта можно приобрести, написав мне: @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
Привет, коллеги! 👋
Собрал для вас вопросы для мок-интервью по Go – можно потренироваться перед реальными собеседованиями.
Зачем это нужно?
🟢 Определим ваш уровень – в каждой теме поймем на какой уровень у вас знания.
🟢 Найдём слабые места – например, выяснится, что с каналами всё ок, а вот с интерфейсами – не очень.
🟢 Разберём ошибки – не только технические, но и как подаёте себя (да, софт-скиллы очень важны).
🟢 Получите конкретный фидбэк – после созвона скажу, куда копать и что подтянуть.
Если хотите "протестировать" себя – пишите, назначим время. Будет полезно 🚀
Собрал для вас вопросы для мок-интервью по Go – можно потренироваться перед реальными собеседованиями.
Зачем это нужно?
Если хотите "протестировать" себя – пишите, назначим время. Будет полезно 🚀
Please open Telegram to view this post
VIEW IN TELEGRAM
1❤2 2 1
Что выведет код?
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 — это некий спасатель от паники 🛡 , который при её возникновении отлавливает её и не даёт программе внезапно завершиться. Но это не все его преимущества: благодаря ему мы можем не только избежать паники, но и получить и обработать сообщение этой паники. Удобно? Очень 🎆
Что касается recover — это некий спасатель от паники
Please open Telegram to view this post
VIEW IN TELEGRAM
🚀 Внимание, разделяю пост для двух групп: вкатывающихся и уже попробовавших го.
🔹 Для начинающих создаю ниже опрос, который поможет понять и подготовить вам наиболее удобный и эффективный материал на тему: "С чего начать изучение Golang".
❗️ Если у вас возникают трудности со стартом или в поиске информации, голосуйте!
❗️ Если у вас есть идеи/желания/боли, которые помогут улучшить качество и ориентированность материала, обязательно пишите! Ваше мнение очень важно!
🔹 Для тех, кто уже имеет базу в Go, и готов попрактиковаться в написании кода в реальном времени, спешу предложить созвониться и проверить ваши силы💪
Возможные темы для лайфкодинга:
🔘 Асинхронные задачи (на worker pool и его друзей)
🔘 Алгоритмы и структуры данных
🔘 SQL
🔘 Базовые задачи (строки, слайсы, мапы)
🔘 Задачи на интерфейсы и структуры (паттерны проектирования, и SOLID)
✏️ Если какие-то пункты (или все сразу) заинтересовали вас, обязательно пишите: @sQUARyss
🔹 Для начинающих создаю ниже опрос, который поможет понять и подготовить вам наиболее удобный и эффективный материал на тему: "С чего начать изучение Golang".
🔹 Для тех, кто уже имеет базу в Go, и готов попрактиковаться в написании кода в реальном времени, спешу предложить созвониться и проверить ваши силы
Возможные темы для лайфкодинга:
Please open Telegram to view this post
VIEW IN TELEGRAM
Формат материала на тему: "С чего начать изучение Golang"
Anonymous Poll
7%
Конспект с разбором базы Golang
27%
Топ самых частых ошибок начинающих (конспект с разбором)
7%
Конспект с ответами на ваши вопросы (соберу в канале)
13%
Созвон с ответами на ваши вопросы (соберу в канале+вытекающие ваши вопросы)
47%
Пошаговый гайд с ссылками на полезные материалы: "Что и где изучить начинающему на старте"
Всем привет‼️ Вспомнил один интересный инструмент, который иногда спрашивают на собеседования - 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)
}
Кто быстрее конкатенирует строки?
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
Хабр
Ускорение конкатенации строк в Go своими руками
Сегодня мы будем разгонять склеивание коротких строк в Go на 30%. Причём для этого нам не нужно будет модифицировать сам Go, всё это будет реализованно в виде сторонней библиотеки . Под катом вас...