Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Я хочу получать рассылки с лучшими постами за неделю
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
Создавая аккаунт, я соглашаюсь с правилами Пикабу и даю согласие на обработку персональных данных.
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр
 Что обсуждали люди в 2024 году? Самое время вспомнить — через виммельбух Пикабу «Спрятано в 2024»! Печенька облегчит поиск предметов.

Спрятано в 2024

Поиск предметов, Казуальные

Играть

Топ прошлой недели

  • AlexKud AlexKud 38 постов
  • SergeyKorsun SergeyKorsun 12 постов
  • SupportHuaport SupportHuaport 5 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая кнопку «Подписаться на рассылку», я соглашаюсь с Правилами Пикабу и даю согласие на обработку персональных данных.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня

Golang + IT

С этим тегом используют

Программирование Программист Разработка IT юмор Юмор Работа Картинка с текстом Все
40 постов сначала свежее
pankovri
pankovri
2 дня назад

Думаешь, ты всё знаешь про defer в Go?⁠⁠

А знаешь ли ты, что за этим простым словом скрывается целый внутренний механизм с собственным стеком и хитрыми оптимизациями?

Думаешь, ты всё знаешь про defer в Go? IT, Golang

💡 В нашем новом посте я разбираю:

- В какой момент вычисляются параметры для defer

- Как defer устроен внутри Go runtime — с реальными структурами и флагами

- Какие крутые оптимизации появились в последних версиях Go, чтобы defer не тормозил программу

- В каких случаях стоит использовать этот механизм, а когда лучше этого не делать

Ссылка на пост https://teletype.in/@pankovri/t7rZdUQ5FqG

Показать полностью 1
[моё] IT Golang
1
5
Dedero
3 месяца назад

Разбираем паттерны конкурентности⁠⁠

Разбираем паттерны конкурентности Программирование, Golang, Многопоточность, Backend, IT, Длиннопост

База

Параллельность - выполнение задач в один момент времени на разных логических ядрах.

Конкурентность - выполнение задач последовательно, но со сменой контекста на другую задачу в ожидание завершения иной задачи. У пользователя может возникнуть иллюзия многозадачности даже в однопроцессорной системе, поскольку смена контекста происходит быстро (микросекунды).

Процессы:

  • Раздельная память

  • Раздельные ресурсы

  • Раздельные регистры

Потоки:

  • Общая память

  • Общие ресурсы

  • Раздельные стэк и регистры

Горутины:

  • Общая память

  • Общие ресурсы

  • Общий системный стэк

  • Общие регистры

Go runtime представляет модель P:M:G.

P - представляет логическое ядро процессора.

M - поток ОС по числу процессоров P.

G - структура, которая выполняет переданную функцию, создаётся по необходимости, минимум одна на старте программы (main). Стэк всего 2кб, может расширятся до 1гб для 64x и до 250кб для 32х систем.

Управление горутинами осуществляется планировщиком Go, а не ОС. Планировщик Go работает в пользовательском пространстве. Мы не можем напрямую управлять на каком процессоре будет исполняться горутина, за это отвечает планировщик.

Канал - очередь сообщений, которая умеет работать в многопоточной среде, работает по принципу FIFO.

Есть два типа каналов: буферизованный и небуферизованный.

Первый может хранить несколько сообщений, второй только одно.

Синхронизация

sync.WaitGroup - счётчик, который позволяет подождать завершения горутин.

sync.Mutex - блокирует доступ к ресурсу.

sync.RwMutex - разделяемая блокировка на чтение и запись. Читать могут несколько горутин, но мутировать данные только одна.

sync.Atomic - атомарная операция чтения и записи. Работает только с простыми значениями.

sync.Map - lock-free структура. Работает так же, как и обычная map, но потокобезопасная, можно использовать в многопоточной среде. Хорошо подходит для случаев, где надо много читать и мало писать. Если надо много писать, то лучше использовать обычную map и sync.RwMutex.

Небуферизованный канал

Разбираем паттерны конкурентности Программирование, Golang, Многопоточность, Backend, IT, Длиннопост

Буферизованный канал

Разбираем паттерны конкурентности Программирование, Golang, Многопоточность, Backend, IT, Длиннопост

Ограничения канала

Разбираем паттерны конкурентности Программирование, Golang, Многопоточность, Backend, IT, Длиннопост

Важные правила

  • Закрывает канал тот, кто в него пишет.

  • Если пишет несколько продюсеров, то закрывает тот, кто создал продюсеров.

  • Не закрытый канал держит ресурсы. Закрывать надо явно.

Паттерны

Generator

Микропаттерн, который наполняет канал. Закрываем канал, чтобы не было проблем.

func generator() <- chan int {

ch := make(chant int)

go func(){

for i := 0; i <= 12; i++ {

ch <- i + 1

}

close(ch)

}()

return ch

}

Wrapper

Оборачиваем функцию, добавляя функциональность. Если вам что-то говорит слово декоратор, то это тот самый паттерн.

func wrapper(wg *sync.WaitGroup, fn func()) {

wg.Add(1)

go func() {

defer wg.Done()

fmt.Println("Work before func")

fn()

time.Sleep(1 * time.Second)

fmt.Println("Work after func")

}()

}

func main() {

var wg sync.WaitGroup

wrapper(&wg, func() {

time.Sleep(1 * time.Second)

fmt.Println("heavy work")

})

wg.Wait()

}

Fan-in

Собирает результаты из нескольких каналов в один.

func fanIn(input1, input2 <-chan string) <-chan string {

ch := make(chan string)

go func(){

for {

select {

case s := <-input1: ch <- s

case s := <-input2: ch <- s

}

}

}()

return ch

}

Fan-out

Одна или несколько горутин пишут в канал, с другой стороны рабочие горутины читают канал, делают работу и умирают.

func worker(ch <-chan int, wg *sync.WaitGroup) {

wg.Done()

for v := range ch {

fmt.Println(v)

time.Sleep(1 * time.Second)

}

}

func sender() {

ch := make(chan int)

var wg sync.WaitGroup

for i := 0; i < 2; i++ {

wg.Add(1)

go worker(ch, &wg)

}

for i := 0; i < 10; i++ {

ch <- i

}

close(ch)

wg.Wait()

fmt.Println("done")

}

Pipeline

Данные обрабатываются цепочкой. Producer -> Producer/Consumer -> Consumer. Стадий обработки может быть сколько угодно.

func producer() <-chan int {

c := make(chan int)

go func() {

for i := 0; i <= 10; i++ {

c <- i + 1

}

close(c)

}()

return c

}

func producerConsumer(c <-chan int) <-chan int {

out := make(chan int)

go func() {

for v := range c {

out <- v * 2

}

close(out)

}()

return out

}

func consumer(ch <-chan int) {

for v := range ch {

fmt.Println(v)

}

}

Rate limiting

Хотя для rate limiter есть множество разных алгоритмов, рассмотрим один, основанный на тиках.

func ticker() {

ch := make(chan int, 5)

go func() {

for i := 0; i < 5; i++ {

ch <- i

}

close(ch)

}()

limiter := time.Tick(time.Second)

for v := range ch {

<-limiter // будем ждать секунду

fmt.Println(v)

}

}

Cancellation

Способ прерывания горутин. Необходим, чтобы избегать висящих горутин, останавливать слишком долгие операции.

1. WithCancel

func worker(ctx context.Context) {

for {

select {

case <-ctx.Done():

fmt.Println("Done")

return

default:

fmt.Println("Working...")

time.Sleep(500 * time.Millisecond)

}

}

}

func main() {

ctx, cancel := context.WithCancel(context.Background())

go worker(ctx)

time.Sleep(1 * time.Second) // работаем

cancel() // отменяем

time.Sleep(1 * time.Second) // время на завершение

}

2. WithTimeout

ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) // спустя 2 секунды воркер перестанет работать

3. WithDeadline. Можно указать точное время остановки.

ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(2*time.Second)) // прибавляем к текущему времени две секунды

Worker Pool

Каждый воркер берёт задачу, делает работу и отправляет результат в канал, другая горутина, в нашем случае main, читает результат из канала.

func worker(jobs <-chan int, results chan<- int, wg *sync.WaitGroup) {

defer wg.Done()

for j := range jobs {

time.Sleep(1 * time.Second)

fmt.Println("job", j)

results <- j * j

}

}

func main() {

jobs := make(chan int)

results := make(chan int)

var wg sync.WaitGroup

for i := 0; i < 3; i++ {

wg.Add(1)

go worker(jobs, results, &wg)

}

go func() {

for i := 0; i < 10; i++ {

jobs <- i

}

close(jobs)

}()

go func() {

wg.Wait()

close(results)

}()

for result := range results {

fmt.Println(result)

}

}

Actor model

Паттерн, при котором акторы общаются только через каналы, и меняют данные только через каналы.

type message struct {

amount int

response chan int

}

func counter(messages chan message) {

for m := range messages {

m.response <- m.amount + 1

close(m.response)

}

}

func main() {

messages := make(chan message)

var wg sync.WaitGroup

go counter(messages)

wg.Add(3)

for i := 0; i < 3; i++ {

go func(i int) {

defer wg.Done()

response := make(chan int)

messages <- message{amount: i, response: response}

fmt.Println(<-response)

}(i)

}

wg.Wait()

close(messages)

}

Это не все паттерны, их целая куча, но уже с этими можно делать интересные вещи, такие как балансировщики нагрузки, pub/sub системы, очереди задач, rate limiter и много всего другого.

Показать полностью 3
[моё] Программирование Golang Многопоточность Backend IT Длиннопост
3
user9315307
user9315307
3 месяца назад
Серия Удачные неудачные проекты

Пришло время вывести мой пет-проект на Go в реальный мир!⁠⁠

Пришло время вывести мой пет-проект на Go в реальный мир! Мультсериалы, Gravity Falls, Программирование, Golang, IT, Приложение

Мои дети, как и я, обожают Гравити Фолз, а у младшего сына даже есть коллекция наклеек с героями. Это и натолкнуло меня на идею: а почему бы не сделать уникальные брелоки?

Чуть-чуть эпоксидной смолы, 20 часов ожидания – и вот они, таинственные артефакты из загадочного городка! Каждый брелок скрывает QR-код с посланием от персонажа.

Правда, есть нюанс... Из-за небольшой ошибки в коде генерации QR сканирование ведёт только на главную страницу, а остаток ссылки придётся дописать вручную - но так даже интереснее!

Показать полностью 1
[моё] Мультсериалы Gravity Falls Программирование Golang IT Приложение
4
Блог компании
practicum.yandex
practicum.yandex
4 месяца назад

Сколько может зарабатывать Go-разработчик в 2025 году⁠⁠

Если кратко — много. А если вы с опытом и скилами, то очень много. Зарплатная вилка для Go-разработчиков в 2025 году — от 80 до 650 тысяч рублей. Зарабатывать можно много, все зависит от вашего упорства и желания учиться. А теперь подробнее.

Сколько может зарабатывать Go-разработчик в 2025 году Карьера, Профессия, Учеба, Курсы, Онлайн-курсы, Программирование, Golang, IT, Длиннопост, Блоги компаний

Сколько зарабатывает Go-разработчик

В среднем

Если смотреть на данные Хабр Карьеры, то в 2025 году это почти 315 тысяч рублей в месяц. У GeekLink цифра даже выше — 386 тысяч. А вот портал Dream Job указывает более скромную зарплату — 226 тысяч.

1/3

Junior

Будем опираться на данные HH Карьеры на начало 2025 года. В целом по России зарплата на старте составит 120–150 тысяч рублей. В Москве и Санкт-Петербурге оклад джуна — от 80 до 160 тысяч. С этих сумм вполне возможно начать карьеру после окончания онлайн-курса «Go-разработчик с нуля».

Сколько может зарабатывать Go-разработчик в 2025 году Карьера, Профессия, Учеба, Курсы, Онлайн-курсы, Программирование, Golang, IT, Длиннопост, Блоги компаний

Middle

При опыте от года зарплата Go-разработчика увеличится до 275–300 тысяч рублей в месяц. Мидлов работодатели ищут чаще, чем джунов: 40% всех открытых вакансий против 8%. Вот какие требования указывают в вакансиях на Hh. Освоить эти навыки поможет курс «Продвинутый Go‑разработчик».

Сколько может зарабатывать Go-разработчик в 2025 году Карьера, Профессия, Учеба, Курсы, Онлайн-курсы, Программирование, Golang, IT, Длиннопост, Блоги компаний

Senior / Lead

При опыте от четырех-пяти лет Golang-разработчик может получать уже около 350 тысяч рублей в месяц и больше — вплоть до 650 тысяч. Развиваться можно как горизонтально, набирая экспертность в технических вопросах, так и вертикально. Например, стать тимлидом и руководить командой.

Вот примеры требований для сеньоров и лидов из объявлений Hh в 2025 году.

1/3

Если вы только планируете идти в IT и еще не уверены, хотите ли стать Go-разработчиком, проходите бесплатную вводную часть нашего курса — и уже потом приступайте к полной программе. Мы в Практикуме поддержим, дадим всю нужную теорию и научим разработке на реальных проектах. После окончания обучения поможем собрать резюме и портфолио, проходить собеседования.

А опытным Go-разработчикам мы предлагаем повысить квалификацию, чтобы рассчитывать на более высокую зарплату и продвигаться в карьере.

У нас есть бесплатные курсы и тесты, которые помогут определиться с профессией, освоить полезные навыки и расширить свои знания об IT в целом.

Реклама ООО «Яндекс», ИНН: 7736207543

Показать полностью 9
Карьера Профессия Учеба Курсы Онлайн-курсы Программирование Golang IT Длиннопост Блоги компаний
4
29
imctobitch
imctobitch
4 месяца назад
Лига программистов
Серия I'm CTO, bitch

Просто⁠⁠

Просто I`m CTO bitch, IT, Просто, Сложно, Программирование, Golang, Микросервисы, Kubernetes, Разработка, Kanban, Бесит, Грубость, Билл Гейтс, Скриншот
Показать полностью 1
[моё] I`m CTO bitch IT Просто Сложно Программирование Golang Микросервисы Kubernetes Разработка Kanban Бесит Грубость Билл Гейтс Скриншот
0
3
dirtyhack
dirtyhack
5 месяцев назад
Типичный программист

Tears in rain⁠⁠

Перечитал комменты, под своей последней (простите но у меня аллергия на слово крайний), статьей на хабре и пришло на ум:

Я видел такое, что вам, людям, и не снилось.

PHP-код, состоящий чуть менее, чем полностью из магических методов.

Атакующие корабли, пылающие над Орионом.

Костыли в FlatASMe, удерживающие систему на честном слове.

Лучи Си, разрезающие мрак у ворот Тангейзера.

Java-классы, унаследованные от 17 абстракций.

И if err != nil, вызвавший холивар среди гоферов.

Все эти мгновения затеряются во времени, как… слёзы в дожде…

Пришло время gc.collect().

Постмодернизм IT Golang PHP Java Assembler Текст
4
3
linoles
linoles
7 месяцев назад

И всё равно старый C++ лучше любого нового Go...⁠⁠

И всё равно старый C++ лучше любого нового Go... Telegram, Telegram (ссылка), Мемы, Юмор, Жизненно, IT, C++, Golang

@slimememes08 - telegram

Мем сделан мной, все совпадения с другими постами случайны. Процесс создания мема в комментариях.

Показать полностью
[моё] Telegram Telegram (ссылка) Мемы Юмор Жизненно IT C++ Golang
3
2
iFixik
8 месяцев назад

Проведу собеседование по сетям или по golang⁠⁠

Всем кому интересно пишите тут.

Работа Собеседование Тренировка Golang IT Текст Короткопост
5
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Директ Промокоды Отелло Промокоды Aroma Butik Промокоды Яндекс Путешествия Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии