Golang (Go), известный чуть менее 15 лет, входит в пятерку популярных языков на Stack Overflow. Порог входа относительно невысок, при этом язык хорошо показывает себя при реализации высоконагруженных проектов, хотя и имеет свои подводные камни.
О работе с Go мы уже рассказывали ранее. Теперь же приготовили тест для начинающих, желающих проверить силы, взглянуть на Go новым взглядом или просто развлечься и узнать немного любопытных фактов. В конце статьи вас ждет инструкция по установке и запуску сервера.
Дисклеймер: гоферы рекомендуют – для того чтобы получить больше удовольствия от теста, избегайте подсказок;)
Часть 1. Основы Go
Вопрос 1. Когда появился GO?
Ответы:
1) 1989
1989? Нет, язык гораздо моложе, он впервые был показан в ноябре 2009 года – тогда как С++, например, известен с 1983 года
2) 1999
1999? Нет, язык гораздо моложе, он впервые был показан в ноябре 2009 года – тогда как С++, например, известен с 1983 года
3) 2009
2009? Верно. Это, пожалуй, первый язык, созданный в эпоху web и многопоточности, что нашло отражение в дизайне языка и его стандартных библиотек
4) 2014
2014? Go, конечно, моложе языков-“мастодонтов” со стажем более 30 лет, но не настолько. Язык впервые показан в ноябре 2009 года
Вопрос 2. Сколько ключевых слов в языке?
Ответы:
1) 25
25? Верно, среди наиболее популярных серверных языков Go имеет меньше всего ключевых слов, что упрощает процесс обучения разработчиков
2) 33
33? Нет, в Go всего 25 ключевых слов, меньше, чем у других популярных серверных языков
3) 50
50? Нет, в Go всего 25 ключевых слов, меньше, чем у других популярных серверных языков
4) 79
79? Нет, в Go всего 25 ключевых слов, меньше, чем у других популярных серверных языков
Вопрос 3. Сколько грамматических правил в языке?
Ответы:
1) 58
58? Верно, количество грамматических правил в Go меньше, чем во многих популярных языках, что обеспечивает относительную легкость его освоения
2) 83
83? Нет, в Go менее 60 грамматических правил, что обеспечивает относительную легкость его освоения, по сравнению с другими популярными языками
3) 216
216? Нет, в Go менее 60 грамматических правил, что обеспечивает относительную легкость его освоения, по сравнению с другими популярными языками
4) 314
314? Нет, в Go менее 60 грамматических правил, что обеспечивает относительную легкость его освоения, по сравнению с другими популярными языками
Команда Google начала разработку языка Go для своих нужд в 2007 году. В отличие от более старых языков, Go формировался в то время, когда веб-технологии и многопоточные вычисления стали обыденностью.
За счет простого синтаксиса и наличия синтаксических чекеров Go, как правило, обеспечивает стилистически однообразный код, что помогает командам упростить погружение новых разработчиков в проекты.
В стандартных библиотеках, в свою очередь, нет скрытых неочевидных циклов, поэтому написанные программы имеют прозрачную вычислительную сложность.
Часть 2. Насколько Go быстрый
Вопрос 4. Перед вами листинг простой программы, которая печатает результаты в несколько потоков. Какое максимальное количество потоков может быть запущено при выполнении этой программы?
import (
"fmt"
"time"
)
func main() {
for i := 1; i <= 3; i++ {
go worker(i)
}
time.Sleep(1 * time.Second)
}
func worker(id int) {
fmt.Println(id)
}
// да-да, time.Sleep() — это плохо, но это самый простой рабочий пример :)
// даже не самый мощный ноутбук сможет запустить 20-30 миллионов простых горутин
Ответы:
1) 2
Нет. 3 воркера запустятся в цикле, и функция main также запустится в отдельном потоке.
2) 3
Близко, но стоит учесть, что и сама функция main также запустится в отдельном потоке.
3) 4
Совершенно верно, 3 воркера запустятся в цикле, и функция main также запустится в отдельном потоке.
4) 10
3 воркера запустятся в цикле, и функция main также запустится в отдельном потоке. Верный ответ — 4.
Немного о Go
Golang — компилируемый язык, и многих интересует вопрос, насколько удобно с этим работать?
В Golang компилятор работает быстро, и даже тяжелый проект соберется за доли секунды. И неважно, разрабатываете вы под Linux, MacOS или Windows. Все, что нужно — написать в терминале go build и все.
Насколько Go быстрый?
Представим, что мы написали небольшой веб-сервер. Он принимает простой запрос и отдает веб-страницу с «Hello, world». Что будет, если по какой-то причине на этот веб-сервер придет одновременно 100000 запросов? Веб-сервер начнет обрабатывать запросы в порядке поступления, и это займет какое-то время. Что если бы ваша программа могла обрабатывать такие запросы параллельно? Многопоточность в Golang реализуется с помощью специальных функций — горутин, и сделать свое приложение многопоточным очень просто.
Допустим, у вас есть сложная функция, которая печатает текст:
func Print( ) {
fmt.Println("Hello, World!")
}
и кто-нибудь вызывает ее, желая распечатать текст:
func Worker() {
Print()
}
чтобы запустить функцию Print( ) в отдельном потоке, достаточно вызвать ее с ключевым словом go
func Worker() {
go Print()
}
И все, у вас многопоточное приложение!
Часть 3. Насколько Go компактный
Вопрос 5. Сколько строк кода нужно, чтобы написать http “hello-world” - сервер, которое на 80-й порт отвечает http-страницей “hello-world”?
Ответы:
1) 8
8? Верный ответ — 10. Если пренебречь читаемостью кода, можно уместить всё даже в 7 строк, но стиль go — это читаемость кода в первую очередь.
2) 10
Верно, всего лишь 10 строк кода, и на localhost:80 вас встречает “hello world”
3) 15
15? Go за лаконичность, верный ответ — 10 :)
4) 21
21? Go за лаконичность, верный ответ — 10 :)
Стоит отметить, что Google не рекомендует использовать дефолтный веб-сервер, и в сообществе уже есть более удачные реализации, поэтому сервер был выбран исключительно для удобства примера. Посмотреть список различных интересных и полезных реализаций можно тут https://github.com/avelino/awesome-go
Вопрос 6. Что надо сделать, чтобы код из предыдущего вопроса заработал?
Ответы:
1) Скомпилировать и запустить
Верно, go создавался когда web стал повседневностью, поэтому http сервер уже есть в стандартной библиотеке
2) Выкачать зависимости импорта, скомпилировать и запустить
Нет, никаких дополнительных зависимостей выкачивать не нужно, go создавался когда web стал повседневностью, поэтому http сервер уже есть в стандартной библиотеке
3) Скомпилировать программу, установить http-cервер и запустить
Нет, никаких дополнительных зависимостей выкачивать не нужно, go создавался когда web стал повседневностью, поэтому http сервер уже есть в стандартной библиотеке
4) Выкачать зависимости импорта, скомпилировать программу, установить http-cервер и запустить
Нет, никаких дополнительных зависимостей выкачивать не нужно, go создавался когда web стал повседневностью, поэтому http сервер уже есть в стандартной библиотеке
Вопрос 7. Сколько времени нужно, чтобы запустить свой первый http-сервер на Go?
Ответы:
1) 3 минуты
Верно, 3 минут хватит для того, чтобы набрать 10 строк кода и запустить “Hello world” (без учета установки Go)
2) 5 минут
Нет, 3 минут хватит с избытком на то, чтобы набрать 10 строк кода и запустить сервер. Не учитываем время на скачивание и установку.
3) 11 минут
Нет, 3 минут хватит с избытком на то, чтобы набрать 10 строк кода и запустить сервер. Не учитываем время на скачивание и установку.
4) 20 минут
Нет, 3 минут хватит с избытком на то, чтобы набрать 10 строк кода и запустить сервер. Не учитываем время на скачивание и установку.
Заключение
В приведенных примерах мы сравнили ожидания и реальность относительно работы с Go — надеемся, что вам было интересно проверить себя или познакомиться с языком впервые. В прошлой статье мы уже рассказывали о том, что в числе преимуществ Go отмечают относительную синтаксическую легкость, удобство и скорость работы, разнообразие инструментов в комьюнити. А что вы думаете об этом языке?
В заключение хотим поделиться инструкцией о том, как за несколько минут установить Go, а также написать и запустить код http-сервера.
Спасибо за внимание!
Ждем на наших мероприятиях и приглашаем подписаться на нас ВКонтакте или в Telegram, чтобы быть в курсе новых событий.
Инструкция по установке и запуску сервера
Если вы используете UBUNTU, откройте терминал
sudo apt update
sudo apt upgrade
sudo apt install golang
На этом установка завершена. Для просмотра версии выполните:
go version
Если на данном шаге go version не выдает версию языка, найти альтернативный способ установки можно на сайте golang.org.
nano server.go
Открытие окна редактирования файла server.go. Наберите код:
package main
import "fmt"
import "net/http"
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello world!!!")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":80", nil)
}
Нажмите CRTL-O, чтобы сохранить файл
Нажмите CTRL-X, чтобы выйти из редактора текста [Если у вас нет редактора nano, установите его, или используйте свой редактор файлов]
go run server.go
Сервер запущен, наберите в браузере localhost:80
Вы должны увидеть надпись Hello world!!!
Вернитесь в терминал, нажмите CTRL-C, чтобы остановить сервер,
снова откройте файл для редактирования:
nano server.go
Измените код:
package main
import "fmt"
import "net/http"
var counter int
func handler(w http.ResponseWriter, r *http.Request) {
counter++
fmt.Fprintln(w, "Hello world!!!")
fmt.Fprintf(w,"You have visit this page %d times", counter)
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":80", nil)
}
Нажмите CRTL-O, чтобы сохранить файл
Нажмите CTRL-X, чтобы выйти из редактора текста [Если у вас нет редактора nano, установите его или используйте свой редактор файлов]
go run server.go
сервер запущен, наберите в браузере localhost:80
В результате вы должны увидеть надпись Hello world!!! и счетчик, который покажет, сколько раз вы посетили эту страницу.
Комментарии (13)
recompileme
17.09.2021 10:17+2Стоит отметить, что Google не рекомендует использовать дефолтный веб-сервер
Простите за резкость, но что за дичь вы несете в массы? Стандартная библиотека разработана как раз для этого. Всегда начинайте с неё. Она создана для того, чтобы быть максимально универсальной, покрывать наибольшее количество угловых кейсов и оставаться эффективной как при раздаче 2 Tb видео файла, так и при использовании для сёрвинга легкой странички.
PS: бывают рекомендации авторов языка, а бывают рекомендации блогеров, которые любят ссылаться на некие "рекомендации Гугол". А еще есть здравый смысл и опыт.
ertaquo
17.09.2021 10:21+9На кой мне знать, когда появился какой-то из языков, сколько в нем ключевых слов и правил синтаксиса? Это как-то поможет в написании кода?
Горутины != потоки.
На кой знать, во сколько строк кода можно уместить "hello world" веб-сервер и как быстро он будет работать, если всегда используется какая-то более сложная обвязка и обработка запросов?
Жирный минус за низкий технический уровень статьи.simbirsoft_team Автор
17.09.2021 12:58-3Согласны, для полноценной разработки на Go, как и любом языке, потребуется гораздо больше знаний. Мы скорее стремились к тому, чтобы осветить возможные возможности языка на основе нескольких сравнимых метрик.
ertaquo
17.09.2021 17:28Поздравляю — вы не осветили ни одной возможности языка, ни одного реального плюса или минуса.
Arashi5
17.09.2021 11:09SimbirSoft, при всем моём к вам уважение, после этой статьи, я не думаю, что кто-то захочет у вас работать.
Большая часть вопрос - максимально оторвана от реальности.
К примеру:Сколько времени нужно, чтобы запустить свой первый http-сервер на Go?
Год назад - я бы отвтеил минут 5-10.
Сейчас я отвечу часа 3-4, потому-что мое представление о том как должен работать пускай первый, но нормальный сервер на go, координально изменилось.simbirsoft_team Автор
20.09.2021 13:13Спасибо за замечания, в следующих статьях мы их обязательно учтем. Тест предназначен в первую очередь для начинающих, тех, кто впервые изучает Go. В условиях задачи мы исходили из минимальных требований, но безусловно нет предела совершенству.
Jsty
17.09.2021 11:10+4Если бы такие вопросы были на собеседовании, я бы крепко задумался, а стоит ли в такой компании работать.
simbirsoft_team Автор
20.09.2021 15:05Спасибо за замечания. Круг вопросов на собеседованиях действительно шире. Тест предназначен в первую очередь для начинающих, тех, кто впервые изучает Go.
host13
17.09.2021 13:17+1В четвертом вопросе не корректно: запускаются горутины, а вопрос про потоки. Каким количеством потоков будут обслуживаться 3 запущенные горутины - сказать заранее трудновато. Точно
будет один главный поток и как минимум 1 - для горутин. Так что, думаю, корректный ответ - от 2 до 4 включительно.
negasus
Блин, серьезно?
simbirsoft_team Автор
Это, вероятно, самый простой вопрос, поскольку он предназначен для разминки)