Для работы с SQL базами в Go существует библиотека database/sql . Эта библиотека предоставляет базовый интерфейс для работы с любой БД, но для каждой конкретной базы, например MySQL, PostgreSQL, MSSQL и т.д., лучше использовать конкретный драйвер. Для PostgreSQL самым распросторенным драйвером был github.com/lib/pq , но сегодня он потерял свою актуальность и ему на смену пришел github.com/jackc/pgx . pgx стремится быть низкоуровневым, быстрым и производительным, а также позволяет использовать специфические для PostgreSQL функции, которые не допускаются в стандартном пакете database/sql .

Для начала установим нужные зависимости:

go get -u github.com/jackc/pgx/v4
go get -u github.com/jackc/pgx/v4/pgxpool

А дальше рассмотрим пример подключения к БД:

package main

import (
        "context"
        "fmt"
        "net/url"
        "os"

        "github.com/jackc/pgx/v4/pgxpool"
)

func main() {
	connStr := fmt.Sprintf("%s://%s:%s@%s:%s/%s?sslmode=disable&connect_timeout=%d",
		"postgres",
		url.QueryEscape("db_user"),
		url.QueryEscape("db_pass"),
		"localhost",
		"5432",
		"db_name",
		5)

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()

	poolConfig, err := pgxpool.ParseConfig(connStr)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Create pool failed: %v\n", err)
		os.Exit(1)
	}
	poolConfig.MaxConns = 20
	poolConfig.MinConns = 5

	pool, err := pgxpool.ConnectConfig(ctx, poolConfig)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Connect to database failed: %v\n", err)
		os.Exit(1)
	}
	fmt.Println("Connection OK!")

	err = pool.Ping(ctx)
	if err != nil {
		fmt.Fprintf(os.Stderr, "Ping failed: %v\n", err)
		os.Exit(1)
	}
	fmt.Println("Query OK!")

	pool.Close(ctx)
}

connStr - это стандартный способ передачи параметров подключения драйверу, используемый в разных библиотеках для разных языков для подключения к PostgreSQL. Как можно заметить мы передаем название протокола, имя и пароль пользователя и, конечно, имя базы. Параметров подключения существует много и с полным списком лучше ознакомится в документации PostgreSQL .

*pgx.Conn представляет одно соединение с базой данных и не является безопасным для параллелизма. Но разработчики предоставлояют подпакет github.com/jackc/pgx/v4/pgxpool для безопасного пула соединений с параллелизмом. Вместо использования pgx.Connect() мы сразу используем пул соединений и настраиваем его через поля MaxConns и MinConns.

Ping() выполняет пустой оператор SQL для *Conn. Если SQL возвращается без ошибок, Ping() базы данных считается успешным, в противном случае возвращается ошибка.

Ну и метод Close() закрывает соединение с базой.