Простейший 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

results matching ""

    No results matching ""