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

Контакт для связи со мной: @sQUARyss
Download Telegram
Всем привет‼️ Вспомнил один интересный инструмент, который иногда спрашивают на собеседования - 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