Проверь себя в Go -1




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

2? Нет, 3 воркера запустятся в цикле, и функция main также запустится в отдельном потоке. Верный ответ — 4 потока.

2) 3

3? Близко, но стоит учесть, что и сама функция main также запустится в отдельном потоке. Верный ответ — 4 потока.

3) 4

4? Совершенно верно, 3 воркера запустятся в цикле, и функция main также запустится в отдельном потоке.

4) 10

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!!! и счетчик, который покажет, сколько раз вы посетили эту страницу.




Комментарии (9):