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