Golang (Go), известный чуть менее 15 лет, входит в пятерку популярных языков на Stack Overflow. Порог входа относительно невысок, при этом язык хорошо показывает себя при реализации высоконагруженных проектов, хотя и имеет свои подводные камни. 

О работе с Go мы уже рассказывали ранее. Теперь же приготовили тест для начинающих, желающих проверить силы, взглянуть на Go новым взглядом или просто развлечься и узнать немного любопытных фактов. В конце статьи вас ждет инструкция по установке и запуску сервера.

Источник: https://github.com/ashleymcnamara/gophers
Источник: https://github.com/ashleymcnamara/gophers

Дисклеймер: гоферы рекомендуют – для того чтобы получить больше удовольствия от теста, избегайте подсказок;)

Часть 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 — компилируемый язык, и многих интересует вопрос, насколько удобно с этим работать?

Источник: https://xkcd.com/303/
Источник: https://xkcd.com/303/

В 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)


  1. negasus
    17.09.2021 10:04
    +3

    Блин, серьезно?


    Основы Go
    Вопрос 1. Когда появился GO?


    1. simbirsoft_team Автор
      17.09.2021 10:18
      -2

      Это, вероятно, самый простой вопрос, поскольку он предназначен для разминки)


  1. recompileme
    17.09.2021 10:17
    +2

    Стоит отметить, что Google не рекомендует использовать дефолтный веб-сервер

    Простите за резкость, но что за дичь вы несете в массы? Стандартная библиотека разработана как раз для этого. Всегда начинайте с неё. Она создана для того, чтобы быть максимально универсальной, покрывать наибольшее количество угловых кейсов и оставаться эффективной как при раздаче 2 Tb видео файла, так и при использовании для сёрвинга легкой странички.

    PS: бывают рекомендации авторов языка, а бывают рекомендации блогеров, которые любят ссылаться на некие "рекомендации Гугол". А еще есть здравый смысл и опыт.


  1. ertaquo
    17.09.2021 10:21
    +9

    На кой мне знать, когда появился какой-то из языков, сколько в нем ключевых слов и правил синтаксиса? Это как-то поможет в написании кода?
    Горутины != потоки.
    На кой знать, во сколько строк кода можно уместить "hello world" веб-сервер и как быстро он будет работать, если всегда используется какая-то более сложная обвязка и обработка запросов?
    Жирный минус за низкий технический уровень статьи.


    1. simbirsoft_team Автор
      17.09.2021 12:58
      -3

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


      1. ertaquo
        17.09.2021 17:28

        Поздравляю — вы не осветили ни одной возможности языка, ни одного реального плюса или минуса.


  1. Arashi5
    17.09.2021 11:09

    SimbirSoft, при всем моём к вам уважение, после этой статьи, я не думаю, что кто-то захочет у вас работать.
    Большая часть вопрос - максимально оторвана от реальности.
    К примеру: Сколько времени нужно, чтобы запустить свой первый http-сервер на Go?
    Год назад - я бы отвтеил минут 5-10.
    Сейчас я отвечу часа 3-4, потому-что мое представление о том как должен работать пускай первый, но нормальный сервер на go, координально изменилось.


    1. simbirsoft_team Автор
      20.09.2021 13:13

      Спасибо за замечания, в следующих статьях мы их обязательно учтем. Тест предназначен в первую очередь для начинающих, тех, кто впервые изучает Go. В условиях задачи мы исходили из минимальных требований, но безусловно нет предела совершенству.


  1. Jsty
    17.09.2021 11:10
    +4

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


    1. simbirsoft_team Автор
      20.09.2021 15:05

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


  1. host13
    17.09.2021 13:17
    +1

    В четвертом вопросе не корректно: запускаются горутины, а вопрос про потоки. Каким количеством потоков будут обслуживаться 3 запущенные горутины - сказать заранее трудновато. Точно
    будет один главный поток и как минимум 1 - для горутин. Так что, думаю, корректный ответ - от 2 до 4 включительно.


    1. simbirsoft_team Автор
      20.09.2021 16:34

      Спасибо за уточнение


  1. sadbot
    20.09.2021 12:11

    Прикольный идея для статьи )