ch1 := make(chan struct{})
ch1 <- struct{}{} //ок, ушло в канал
ch1 <- struct{}{} //висим и ждем когда кто-нить прочитает из канала
ch2 := make(chan struct{},3)
ch2 <- struct{}{} //ок, ушло в канал
ch2 <- struct{}{} //также ушло
ch2 <- struct{}{} //и еще ушло
ch2 <- struct{}{} //а вот тут лок. висим и ждем когда кто-то прочитает из канала
В частности, в январе 2013 года, когда все закрутилось и стало расти в геометрической прогрессии, нам пришлось перестроить всю систему, потому что она становилась все более запутанной. В частности, мы распределили все сервисы, чтобы в случае падения одного из сервисов не рухнула вся система.
В общем, мы убили кучу времени на то, чтобы перестроить код и перепланировать всю архитектуру. И вот тогда в наше поле зрения и попал Go, потому что это очень быстрый, новый язык, в котором много интересного. Думаю, это большая редкость — иметь идеальную тестовую площадку для таких вещей. А когда у тебя тысячи серверов, рассредоточенных по всему миру, Go очень естественно ложится в эту распределенную систему.
По сути, мы прошли через все муки роста, наша работа не ограничивалась созданием новых фишек и допиливанием продукта. Например, планирование выглядело следующим образом: мы оценивали свои масштабы, умножали их на десять и уже на эту цифру опирались, работая со своей архитектурой. И почти каждый раз, когда мы практиковали это «упражнение», Go вписывался идеально. К тому же люди, которым интересен Go, как правило, очень хорошие разработчики, и им интересны те проблемы, над которыми работаем мы. Благодаря этому мы смогли набрать большую команду отличных инженеров, готовую как поддерживать существующие продукты, так и делать новые.