понедельник, 28 января 2019 г.

Эффективный Go: пустой идентификатор в импорте и переменных

Неиспользуемый импорт и переменные

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

Эта наполовину написанная программа имеет два неиспользованных импорта (fmt и io) и неиспользованную переменную (fd), так что она не скомпилируется, но было бы неплохо увидеть, верен ли пока код.

package main

import (
    "fmt"
    "io"
    "log"
    "os"
)

func main() {
    fd, err := os.Open("test.go")
    if err != nil {
        log.Fatal(err)
    }
    // TODO: использовать fd.
}

Чтобы заставить замолчать жалобы о неиспользованном импорте, используйте пустой идентификатор для ссылки на символ из импортируемого пакета. Аналогично, присвоение неиспользуемой переменной fd пустому идентификатору заставит замолчать ошибку о неиспользованной переменной. Эта версия программы компилируется.

package main

import (
    "fmt"
    "io"
    "log"
    "os"
)

var _ = fmt.Printf // Для отладки; удалите в дальнейшем.
var _ io.Reader    // Для отладки; удалите в дальнейшем.

func main() {
    fd, err := os.Open("test.go")
    if err != nil {
        log.Fatal(err)
    }
    // TODO: использовать fd.
    _ = fd
}

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

Импорт для побочного эффекта

Неиспользуемый импорт, такой как fmt или io в предыдущем примере в конечном итоге должен быть использован или удален: пустые назначения свидетельствуют о незавершенной работе над кодом. Но иногда полезно импортировать пакет только для его побочных эффектов, без какого-либо явного использования. Например, во время его функции init пакет net/http/pprof регистрирует обработчики HTTP, которые обеспечивают отладочную информацию. У него есть экспортированный API, но большинству клиентов нужна только регистрация обработчика и получить доступ к данным через веб-страницу. Чтобы импортировать пакет только для его побочных эффектов, переименуйте пакет на пустой идентификатор:

import _ "net/http/pprof"

Эта форма импорта дает понять, что пакет импортируется из-за его побочных эффектов, потому что нет другого использования пакета: в этом файле у него нет имени. (Если имя будет, и мы не будем использовать это имя, компилятор отклонит программу.)


Читайте также:


Комментариев нет:

Отправить комментарий