Простейший 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.ResponseWriterrимеет тип*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