Что? Зачем?! Это сделано потому, что, есть ненулевая вероятность, того что на машине(ядре) контекст выполнения соответствует тому, что нужен именно этой горутине, поэтому часто имеет смысл выполнить её вперёд остальных. Также эту оптимизацию объясняют так, что мы оптимизируем время ожидания горутин, чтобы последняя пришедшая ждала не так долго, потому что возможно она предназначена для более приоритетных задач, чем те кто в обычной очереди
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3 2❤1 1
Привет всем!➡️
💻 Не успеваю закончить конспект по разработке микросервиса – выложу его в начале следующей недели.👈
✅ Мне показалось, что конспект стоит модифицировать, чтобы вам было проще, в связи с этим хотел бы узнать ваше мнение какой формат вам удобнее и понятнее.💬
⭕️ Буду рад обратной связи!😳
Please open Telegram to view this post
VIEW IN TELEGRAM
Anonymous Poll
29%
23%
66%
Что выведет данный код?
func main() {
items := []string{
"Кошка",
"Собака",
"Роза",
}
animals := items[0:2]
plants := items[2:3]
animals = append(animals, "Хомяк")
fmt.Printf("Животные: %v (len: %d, cap: %d)\n", animals, len(animals), cap(animals))
fmt.Printf("Растения: %v (len: %d, cap: %d)\n", plants, len(plants), cap(plants))
}
✅Код выведет: Животные: [Кошка Собака Хомяк] (len: 3, cap: 3) Растения: [Хомяк] (len: 1, cap: 1)🤩
💬Давайте последовательно, как получились такие капасити и длина?
❕Тут важно вспомнить теорию ломтиков - когда мы отрезаем ломтик, его капасити высчитывается как капасити родительского слайса вычесть стартовый индекс ломтика. 📌Таким образом конечные cap(animals) = 3 - 0 = 3; cap(plants) = 3 - 2 = 1. С длинной все проще, сколько элементов по факту в ломтике, столько и длина➡️
🟢Почему хомяк закрался в растения?
💻Animals при достижении append хранит в себе [Кошка, Собака], при этом len=2, так как у нас два элемента, а cap = 3 (считаем как в предыдущем пункте). ВАЖНО❕у ломтиков такой же массив родитель что у items, получается если был items из трех элементов мы отрезали два, то по факту мы просто на том же блоке памяти добавили ссылок для новых ломтиков. То есть мы смотрим в animals и видим [Кошка, Собака], но в памяти все равно набор данных строк лежит как [Кошка, Собака, Роза], просто у ломтика конечный индекс другой. ➡️Поэтому когда мы добавляем в animals "Хомяк", капасити нам позволяет в тот же массив родитель добавить, так как длинна 2 < cap 3. ➡️Поэтому в тот же массив родитель мы и производим наши изменения, а так как индекс ломтика завершился на Собака, то когда происходит append мы инкрементим индекс и просто перезаписываем Роза на Хомяк в памяти🔘
💬Давайте последовательно, как получились такие капасити и длина?
❕Тут важно вспомнить теорию ломтиков - когда мы отрезаем ломтик, его капасити высчитывается как капасити родительского слайса вычесть стартовый индекс ломтика. 📌Таким образом конечные cap(animals) = 3 - 0 = 3; cap(plants) = 3 - 2 = 1. С длинной все проще, сколько элементов по факту в ломтике, столько и длина➡️
🟢Почему хомяк закрался в растения?
💻Animals при достижении append хранит в себе [Кошка, Собака], при этом len=2, так как у нас два элемента, а cap = 3 (считаем как в предыдущем пункте). ВАЖНО❕у ломтиков такой же массив родитель что у items, получается если был items из трех элементов мы отрезали два, то по факту мы просто на том же блоке памяти добавили ссылок для новых ломтиков. То есть мы смотрим в animals и видим [Кошка, Собака], но в памяти все равно набор данных строк лежит как [Кошка, Собака, Роза], просто у ломтика конечный индекс другой. ➡️Поэтому когда мы добавляем в animals "Хомяк", капасити нам позволяет в тот же массив родитель добавить, так как длинна 2 < cap 3. ➡️Поэтому в тот же массив родитель мы и производим наши изменения, а так как индекс ломтика завершился на Собака, то когда происходит append мы инкрементим индекс и просто перезаписываем Роза на Хомяк в памяти🔘
Что выведет данный код
func main() {
var ch chan int
select {
case ch <- 1:
fmt.Println("Успешно отправили в канал")
case <-time.After(1 * time.Second):
fmt.Println("Время вышло")
}
}
Код выведет:
Anonymous Poll
50%
Панику, запись в нил канал
5%
Сработает случайный select-кейс
43%
Время вышло
3%
Успешно отправили в канал
Во втором кейсе мы получаем канал, в который через секунду получим ответ. Так как больше кейсов нет, один кейс false, а второй ждем, значит мы просто прождем секунду и выведем
Важно
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5 2
Всем привет❕
Сегодня наконец закончили создание для вас конспекта💻
В нем вы сможете найти:
🔘 Назначение и реализацию слоев написанного микросервиса
🟢 Подводные камни межслойного взаимодействия
🔘 Ответы на наиболее интересные и актуальные вопросы с созвона
🟢 Наставления из личного опыта разработки и менторства
🔘 Ссылку на гитхаб репо с кодом
Для приобретения конспекта за символическую цену, напишите мне🥳
🖥
Сегодня наконец закончили создание для вас конспекта
В нем вы сможете найти:
Для приобретения конспекта за символическую цену, напишите мне
Please open Telegram to view this post
VIEW IN TELEGRAM
1 4❤2👍1 1
Anonymous Poll
23%
1. Mock-тесты в микросервисе: покроем мок-тестами микросервис разобранный в конспекте выше🔘
20%
2. Новые мапы: разберем swiss table и другие нововведения мапы🔘
6%
3. Запуск сервиса в докере🔘
17%
4. Паттерны конкурентного программирования: поговорим о популярных паттернах (worker pool и другие)🔘
20%
5. Планировщик в го🔘
11%
6. Разбор моck-собеседования🔘
3%
7. Напишу тебе свой вариант 🔘
Всем привет⭕️
Хочу сказать огромное спасибо каждому за очень большую активность в покупке конспекта — ваша поддержка мотивирует меня делать еще больше полезных материалов❕
➡️ Когда мы с вами общались, многие спрашивали чем я занимаюсь. Так вот решил вкратце ответить: я работаю в сфере 👣 уже более 5 лет, на данный момент работаю в Самокате.
За это время я понял одно➡️ мне очень интересно учить и развивать людей в этой теме, ровно поэтому уже на протяжении 4-х лет помогаю начинающим устраиваться на работу и писать классный код. Последние полтора года занимаюсь менторством в Эйч Навыках, где тоже подготовил уже большое количество специалистов🔘
Хочу сказать огромное спасибо каждому за очень большую активность в покупке конспекта — ваша поддержка мотивирует меня делать еще больше полезных материалов
За это время я понял одно
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Go Level Up pinned «Всем привет⭕️ Хочу сказать огромное спасибо каждому за очень большую активность в покупке конспекта — ваша поддержка мотивирует меня делать еще больше полезных материалов❕ ➡️ Когда мы с вами общались, многие спрашивали чем я занимаюсь. Так вот решил вкратце…»
Please open Telegram to view this post
VIEW IN TELEGRAM
Что должно быть в разборе Mock-тестов 🧐
Anonymous Poll
62%
Разбор наиболее используемого решения в коммерции - генераторов моков ⚡️
29%
Самописная реализация моков с нуля ⚡️
33%
Наглядные примеры антипаттернов моков, которые встречаются 📛
48%
Теория по мокам, что это такое и зачем нужно, чем удобно в коммерции 👨💻
62%
Примеры для мока конкретных запросов БД или 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