Выборка URL в Go
Для множества приложений доступ к информации в Интернете не менее важен, чем доступ к локальной файловой системе.
Go предоставляет коллекцию пакетов, сгруппированную в каталоге net
,
которая облегчает отправку и получение информации из Интернета,
создание низкоуровневых соединений и настройку серверов, для чего в особенности полезны возможности параллелизации Go.
Для иллюстрации минимально необходимого кода для получения информации по протоколу HTTP
ниже приведена простая программа fetch
,
которая осуществляет выборку содержимого по каждому из указанных URL
и выводит его как не интерпретированный текст; эта программа создана по мотивам неоценимо полезной утилиты curl
.
// Выводит ответ на запрос по заданному URL package main import ( "fmt" "io/ioutil" "net/http" "os" ) func main() { for _, url := range os.Args[1:] { resp, err := http.Get(url) if err != nil { fmt.Fprintf(os.Stderr, "fetch: %v\n", err) os.Exit(1) } b, err := ioutil.ReadAll(resp.Body) resp.Body.Close() if err != nil { fmt.Fprintf(os.Stderr, "fetch: reading %s: %v\n", url, err) os.Exit(1) } fmt.Printf("%s", b) } }
В этой программе вводятся функции из двух пакетов:
- net/http и
- io/ioutil.
Функция http.Get
выполняет HTTP-запрос и при отсутствии ошибок возвращает результат в структуре resр
.
Поле Body этой структуры содержит ответ сервера в виде потока, доступного для чтения.
Затем ioutil.ReadAll
считывает весь ответ; результат сохраняется в переменной b.
Поток Body закрывается для предотвращения утечки ресурсов, и функция Printf записывает ответ в стандартный вывод.
$ go build fetch $ ./fetch http://gopl.ioThe Go Programming Language
В случае ошибки HTTP-запроса fetch сообщает о том, что произошло:
$ ./fetch http://bad.gopl.io fetch: Get http://bad.gopl.io: dial tcp: lookup bad.gopl.io: no such host
В случае любой ошибки os.Exit(1)
завершает работу процесса с кодом состояния 1.