Выборка 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.