Go — интересный язык программирования для создания современных веб-приложений, а также системного программного обеспечения. После своего выпуска он вызвал огромный ажиотаж и стал основой таких сервисов, как Docker, Kubernetes, Terraform, Dropbox и Netflix .
Более того, обширная коллекция встроенных пакетов Go делает его отличным выбором для веб-программирования. Эта статья покажет вам, как написать базовый веб-сервер на Go.
Импортируйте необходимые пакеты
Пакет net/HTTP предоставляет все необходимое для создания веб-сервера и клиента. В этом пакете представлены некоторые полезные функции для веб-программирования.
Вы можете импортировать его, добавив строку ниже в начало исходного кода:
import "net/http"
В статье также будет использоваться пакет fmt для форматирования строк и пакет log для обработки ошибок. Вы можете импортировать их по отдельности, как показано выше, или импортировать все пакеты с помощью одного оператора импорта:
import (
"fmt"
"log"
"net/http"
)
Приступить к написанию основной функции можно после импорта необходимых пакетов. Идем дальше и сохраняем исходный файл с расширением .go . Если вы используете Vim , используйте команду ниже, чтобы сохранить и выйти из Vim:
:wq server.go
Напишите основную функцию
Программы Go находятся непосредственно внутри основной функции, метко названной «main». Здесь вам нужно будет сделать вызов сервера . Добавьте следующие строки в исходный код и посмотрите, что они делают:
func main() {
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8080", nil))
}
В примере определяется основная функция с использованием ключевого слова func . В Go действуют строгие правила относительно положения открывающей скобки, поэтому убедитесь, что открывающая скобка находится на правильной строке. Первый оператор в main определяет, что все веб-запросы к корневому пути ( «/» ) будут обрабатываться индексом, функцией типа http.HandlerFunc .
Вторая строка запускает веб-сервер через функцию http.ListenAndServe . Он сигнализирует серверу о необходимости непрерывного прослушивания входящих HTTP-запросов на порту 8080 сервера. Второй параметр этой функции нужен для блокировки программы до конца.
Поскольку http.ListenAndServe всегда возвращает ошибку, в примере этот вызов обертывается внутри вызова log.Fatal . Этот оператор регистрирует любые сообщения об ошибках, сгенерированные на стороне сервера.
Реализация функций обработки
Как видите, основная функция вызывает функцию-обработчик index для обработки клиентских запросов. Однако в примере еще не определена эта функциональность для своего сервера.
Давайте добавим необходимые операторы, чтобы сделать индексную функцию пригодной для использования:
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, welcome to %s!", r.URL.Path[1:])
}
Эта функция принимает два разных аргумента типа http.ResponseWriter и http.Request . Параметр http.ResponseWriter содержит ответ сервера на входящий запрос в форме объекта http.Request .
Функция Fprintf из пакета fmt используется для отображения текстовых строк и управления ими. В статье это используется для отображения ответа сервера на веб-запросы. Наконец, элемент r.URL.Path[1:] используется для извлечения данных после корневого пути.
Добавляем все оставшиеся части
Ваш веб-сервер Go будет готов, как только вы добавите все оставшиеся компоненты. Код будет выглядеть следующим образом:
import (
"fmt"
"log"
"net/http"
)
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hi there, welcome to %s!", r.URL.Path[1:])
}
func main() {
http.HandleFunc("/", index)
log.Fatal(http.ListenAndServe(":8080", nil))
}
Первая строка необходима для компиляции кода веб-сервера Go в виде исполняемого файла.
Скомпилируйте этот код веб-сервера Go как исполняемый файл.