Спецификация языка Go описывает несколько встроенных предопределенных идентификаторов, которые не следует использовать в качестве имен в программах Go.
В зависимости от контекста, повторное использование этих идентификаторов в качестве имен либо затеняет оригинал в текущей лексической области (и любых вложенных областях), либо делает затронутый код сбивающим с толку. В лучшем случае компилятор пожалуется; в худшем случае такой код может привести к скрытым ошибкам, которые трудно обнаружить с помощью поиска.
Неудачный вариант:
var error string
// `error` затеняет встроенный идентификатор
// или
func handleErrorMessage(error string) {
    // `error` затеняет встроенный идентификатор
}
Более удачный вариант:
var errorMessage string
// `error` относится к встроенному идентификатору
// или
func handleErrorMessage(msg string) {
    // `error` относится к встроенному идентификатору
}
Неудачный вариант:
type Foo struct {
    // Хотя эти поля технически не
    // составляют затенение, поиск для
    // строк `error` или` string` теперь
    // неоднозначен.
    error  error
    string string
}
func (f Foo) Error() error {
    // `error` и` f.error`     
    // визуально похожи
    return f.error
}
func (f Foo) String() string {
    // `string` и` f.string`
    // визуально похожи
    return f.string
}
Более удачный вариант:
type Foo struct {
    // Строки `error` и` string`
    // теперь однозначны.
    err error
    str string
}
func (f Foo) Error() error {
    return f.err
}
func (f Foo) String() string {
    return f.str
}
Обратите внимание, что компилятор не будет генерировать ошибки при использовании предопределенных идентификаторов, но такие инструменты, как go vet, должны правильно указывать на эти и другие случаи затенения.
Читайте также:
- Go style guides: не используйте panic
 - Go style guides: избегайте встраивания типов в общедоступные структуры
 - Go style guides: обертывание ошибок, обработка ошибок утверждения типа
 

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