Простейший web-сервер
В этой главе мы напишем простейший web-сервер, который будет отдавать HTML страницу содержащую текст "hello world".
Создадим папку для нашего приложения src/app
и внутри нее файл main.go
.
Почему код приложения должен быть размещен в папке src
рабочей директории объясняется
в следующей главе.
package main
import (
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("hello world"))
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
Для запуска перейдите в рабочую директорию и наберите.
go run src/app/main.go
Затем наберите в браузере http://localhost:8080 и вы увидете текст "hello world"
Разберем файл построчно. Первая строка package main
- это объявление имени пакета.
Важно:
- только пакет с именем
main
может быть запущен командойgo run
- точкой входа всегда служит функция с именем
main
- любой файл должен начинаться с объявления имени пакета
- имя пакета у всех файлов, которые лежат в одной папке должно быть одинаковым!
Далее следует импорт пакета net/http
из стандартной библиотеки, который
отвечает за работу с http
.
За ним следует объявление функции handler
, которая обрабатывает http запрос к функции
main
, которая служит точкой входа.
Рассмотрим код внутри функции handler
. У функции handler
есть два аргумента:
w
имеет типhttp.ResponseWriter
r
имеет тип*http.Request
.
Тип http.ResponseWriter
- это интерфейс в стандартном пакете http
, он имеет функцию Write
, которой
мы воспользовались для вывода строки 'hello world'.
w.Write([]byte("hello world"))
Обратите внимание, что Write принимает в качестве аргумента переменную, имеющую тип
[]byte
слайс байтов. Поэтому нам пришлось явно привести строку "hello world" к типу
[]byte
. Что такое слайс мы разберем далее.
В Go нет автоматического приведения типов. Все преобразования типов должны быть явные. Приведение типа можно выполнить, указав нужный тип, а затем в скобках переменную.
Также нужно понимать, что не все типы могут быть преобразованны таким образом.
Например, так не получится преобразовать строку в целое, для этого придется воспользоваться
стандатным пакетом strconv
.
Request - это структура, у которой есть методы для работы с http запросом, такие как получение get параметром, данных cookie файлов и т.д.
Рассмотрим код внутри функции main
:
http.HandleFunc("/", handler)
говорит web-серверу о том, что для обработки
корневых запросов нужно использовать нашу функцию handler
http.ListenAndServe(":8080", nil)
- запускает web-сервер на порту 8080. Второй
пераметр, в данном случае, нам не нужен, поэтому вместо указателя мы передаем nil
Код находится в src/hello_world
.
Задание
Измените код функции handler так, чтобы вместо надписи "hello world" выводилась
надпись "hello" + текущий значение UserAgent браузера пользователя. Для получения значения
UserAgent воспользуйтесь методом UserAgent
структуры http.Request